2015-08-13 23 views
5

Próbuję znaleźć liczbę dopasowań dla danego ciągu dla dużego projektu. Obecnie to zrobić z ag Używam następujące polecenia:Policz całkowitą liczbę dopasowań w katalogu z ag

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc 

co jest oczywiście nieco przydługi i nie bardzo intuicyjny. Czy istnieje lepszy sposób na uzyskanie całkowitej liczby dopasowań w katalogu od ag? Przeszukałem dokumentację i nie znalazłem tam niczego przydatnego.

Edit: Dzięki recent commit do ag, nazwy plików mogą być usunięte z ag zamiast sed, więc to działa również:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc 

Uwaga: Zdaję sobie sprawę, co mogłem zrobić to z ack -hcl searchterm (no, prawie W moim konkretnym przypadku potrzebowałbym również --ignore-dir building), ale ponieważ jest to już duży projekt (i będzie znacznie rósł), zwiększenie prędkości oferowane przez ag czyni to lepszym (ack zajmuje około 3 sekund dla mojego przeszukuje prawie natychmiastowy wynik w postaci ag), więc chciałbym k z tym.

+0

Czy kiedykolwiek znaleźć odpowiedź na to pytanie? – jjaderberg

+0

@jjaderberg Niezupełnie. Najlepszą opcją wydaje się opcja '--stats', po której następuje parsowanie poprawnej linii. (np. 'ag --stats searchterm | tail -n 5 | head -n 1'). Przesłałem również żądanie pobrania dla opcji '--stats-only', która uniemożliwia drukowanie innych elementów, w tym przypadku' ag --stats searchterm | head -n 1' otrzyma liczbę dopasowań. W obu tych przypadkach musisz odfiltrować "mecze", aby uzyskać tylko liczbę. – SnoringFrog

Odpowiedz

7

Używam ag, aby dopasować statystyki. Na przykład.:

>$ ag --stats --java -c 'searchstring' | ag '.*matches' 
>$ 22 matches 
>$ 6 files contained matches 

Filtr z uprzedzona drukować tylko liczbę meczy:

>$ ag --stats --java -c 'searchstring' | ag -o '^[0-9]+(?=\smatches)' 
>$ 22 
2

Nadal nie świetne rozwiązanie, ale tutaj jest to, co udało mi się wymyślić thusfar dla każdego, kto znajdzie to:

Jeśli nie szukasz ogromne ilości plików, wystarczy użyć ack -hcl searchterm, inaczej .. .

byłem w stanie poprawić polecenia w moim pytaniu wykorzystując opcję --stats, który dołącza coś jak następuje do wyników wyszukiwania:

714 matches 
130 files contained matches 
300 files searched 
123968435 bytes searched 
0.126203 seconds 

do stosowania ręcznego, to wystarczająco dobre (chociaż wciąż zalewa ekran wszystkimi dopasowaniami), ale w przypadku skryptów wciąż potrzebuję tylko numeru. Tak, w tym celu Poszedłem z komendy w moim pytaniu się do tego:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1 

lub bardziej zwięzłe, ale mniej niezapomniany

$ ag --stats searchterm | tac | awk 'NR==5 {print $1}' 

(zastąpić tac z tail -r jeśli don” t ma tac)

Aby zapisać trochę więcej pisania, I aliasing drugiej połowie polecenia, więc mogę po prostu rur ag --stats do mojego alias i dostać to, co chcę. Tak więc z alias agmatches='tac | awk "NR==5 {print \$1}' mogę uzyskać tylko mecze, uruchamiając ag --stats searchterm | agmatches.

Nadal byłoby znacznie lepiej, gdyby było coś wbudowanego w ag, aby ułatwić to. Wysłałem żądanie pobrania dla opcji wyjściowej --stats-only, która pomogłaby, , ale nic z tego nie wyszło, która jest dostępna, jeśli tworzysz bezpośrednio z repozytorium, ale nie jest jeszcze w stabilnym wydaniu, więc powinno to przyspieszyć przetwarzaj smakołyk dla dużej liczby wyników.

Powiązane problemy