Подсчитайте общее количество совпадений в каталоге с помощью ag

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

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

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

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

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

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

4 ответа

Решение

Я использую 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   

ag -o --nofilename --nobreak 'searchstring' | wc -l

  • -o печатает каждый матч индивидуально
  • --nofilename удаляет имена файлов из вывода
  • --nobreak удаляет переводы между совпадениями в разных файлах

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

Если вы не ищете огромное количество файлов, просто используйте 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 если у вас нет tac)

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

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

Мне нравится ответ Грегори выше, но добавлю еще немного контекста:

ag --stats --java -c 'searchstring' | ag '.* соответствует'

  • В --java флаг указывает, что ag будет искать только файлы с .java (а также .properties) расширения . Итак, если вы искали в проекте Python для .py файлы, вы должны использовать --pythonфлаг. Запустить ag --list-file-types для всех типов файлов, доступных для поиска.
  • В -c или же --countflag предоставляет количество совпадений .
Другие вопросы по тегам