Удалить имя файла при рекурсивном подсчете количества вхождений шаблона

Удалить имя файла при рекурсивном подсчете количества вхождений шаблона

Когда я запускаю команду grep:

grep -rc 'PATTERN' .

он выводит количество строк, в которых встречается шаблон, но выглядит он так:

./hotel_232424.dat:234

и так далее...

Как мне снять деталь ./hotel_232424.dat:и просто распечатать номер?

решение1

В реализации GNU для этого grepесть опция -h/ --no-filename.

$ grep -rc PATTERN .
./b:1
./a:0
./1/2/c:2
$ grep -rhc PATTERN .
1
0
2

Портативный/стандартный эквивалент будет следующим:

$ find . -type f -exec grep -c PATTERN {} \;
0
2
1

но это означало бы выполнение одного grepвызова для каждого файла.

Если вместо этого вам нужно общее количество вхождений (здесь 1+2 = 3), вы можете сделать (переносимо):

$ find . -type f -exec cat {} + | grep -c PATTERN
3

(обратите внимание, что если в некоторых файлах после последней строки есть данные (то есть нетекстовые файлы), это может испортить результат)

Или, с такой grepподдержкой -r, как у вас:

$ grep -r PATTERN . | wc -l
3

Связанный контент