Подсчитайте общее количество совпадений в каталоге с помощью 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
или же--count
flag предоставляет количество совпадений .