2015-08-13 2 views
5

Я пытаюсь найти количество совпадений для данной строки в большом проекте. В настоящее время, чтобы сделать это с ag я использую следующую команду:Подсчитайте общее количество совпадений в каталоге с ag

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

, который, очевидно, немного длинный и не очень интуитивным. Есть ли лучший способ получить общее количество совпадений в каталоге от ag? Я прорыл документацию и не нашел там ничего полезного.

Edit: Благодаря recent commit к ag, имена файлов могут быть удалены с ag вместо sed, так что это также работает:

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

Примечание: Я понимаю, что я мог бы сделать это с ack -hcl searchterm (ну, почти В моем конкретном случае мне понадобится также --ignore-dir building), но поскольку это уже большой проект (и будет значительно расти), ускорение скорости, предлагаемое ag, делает его предпочтительным (ack занимает около 3 секунд для моего поиск vs ag почти мгновенный результат), поэтому я хотел бы stic k с ним.

+0

ли вы когда-нибудь найти ответ на этот вопрос? – jjaderberg

+0

@jjaderberg Не совсем. Лучшим вариантом является опция '--stats', за которой следует разбор правильной строки. (например, 'ag --stats searchterm | tail -n 5 | head -n 1'). Я также отправил запрос на перенос для параметра «--stats-only», который запрещает печатать другое, в этом случае 'ag --stats searchterm | head -n 1' получит количество матчей. В обоих случаях вам все равно нужно отфильтровать «совпадения», чтобы получить только номер. – SnoringFrog

ответ

7

Я использую ag, чтобы соответствовать статистике. Например.:

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

Фильтр с опережающего просмотра, чтобы напечатать только количество матчей:

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

Еще не большое решение, но здесь не то, что мне удалось придумать thusfar для кого-то, кто находит это:

Если вы не ищете огромное количество файлов, просто используйте ack -hcl searchterm, в противном случае .. .

я смог улучшить команду в моем вопросе, усиливая --stats вариант, который присоединяет нечто вроде следующего к результатам поиска:

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

для ручного использования, достаточно хорошо (хотя он все еще наводняет экран всеми совпадениями), но для скриптов мне все равно нужно только число. Таким образом, с этой целью, я пошел от команды на мой вопрос сводится к следующему:

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

или более емким, но менее запоминающимся

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

(заменить tac с tail -r, если вы не» t есть tac)

Чтобы сохранить немного больше ввода текста, я сгладил вторую половину команды, поэтому я могу просто соединить ag --stats с моим псевдонимом и получить то, что хочу. Итак, с alias agmatches='tac | awk "NR==5 {print \$1}' я могу получить только матчи, запустив ag --stats searchterm | agmatches.

Все еще было бы намного лучше, если бы это было нечто встроенное в ag, чтобы помочь этому. Я отправил запрос на вывод для опции вывода --stats-only, которая помогла бы, , но ничего не получилось, которое доступно, если вы создаете непосредственно из репо, но еще не в стабильном выпуске, чтобы ускорить обрабатывать лакомый кусочек для большого количества результатов.

Смежные вопросы