Как подсчитать все совпадения строки с помощью grep для Linux
grep
– это утилита текстового поиска, которая может работать со стандартным вводом или несколькими файлами одновременно. Он используется для вывода совпадений с шаблонами, строками или регулярными выражениями. Часто полезно иметь возможность подсчитать количество совпадений, что grep
может сделать довольно легко.
Подсчет совпадений с помощью grep
Команда grep
имеет флаг -c
, который будет подсчитывать количество совпавших строк и выводить число. Это полезно для многих вещей, таких как поиск в файлах журналов количества записей с IP-адреса частицы, конечной точки или другого идентификатора.
grep -c "1.2.3.4" /var/log/nginx/access.log
Однако grep
может совпадать несколько раз в строке. Если вы используете флаг -o
, grep
будет печатать новую строку при каждом совпадении. Это не работает с флагом -c
, так как он будет учитывать только совпадающие строки, а не несколько совпадений в строке.
Лучшим решением является использование утилиты wc
(счетчик слов) с параметром -l
(lines), которая будет подсчитывать необработанное количество строки, переданные ему через стандартный ввод. Использование wc -l
– предпочтительное решение, поскольку оно работает с -o
для подсчета количества вхождений заданной строки или шаблона во всем файле.
grep -o "foo" file | wc -l
Подсчет по нескольким файлам
Приятной особенностью grep
является возможность обработки нескольких файлов одновременно, которые либо передаются через xargs
, параметры, либо поставляются с подстановочными знаками. При обработке нескольких файлов grep
распечатает имя файла перед совпадением. При использовании -c
для подсчета количества совпадающих строк будут также распечатаны имена файлов:
grep "foo" ./*.txt -cH
Вы всегда должны использовать флаг -H
при работе с несколькими файлами, так как он всегда будет печатать имя файла, даже если в grep
передается только один файл. Это предотвратит поломку автоматизации, если вы зависите от наличия имени файла.
Если вы хотите использовать -o
для подсчета нескольких совпадений в строке и передать результат wc -l
, вы, к сожалению, не сможете увидеть числа для каждого отдельного файла. как с -c
. Однако, немного написав сценарий, вы можете отрезать первый столбец с помощью cut
и подсчитать количество уникальных вхождений для каждого имени файла с помощью uniq -c
:
grep "foo" ./*.txt -o | cut -d ':' -f 1 | uniq -c