Посчитайте все вхождения строки во множестве файлов с помощью grep - PullRequest
280 голосов
/ 16 декабря 2008

У меня есть куча файлов журналов. Мне нужно выяснить, сколько раз строка встречается во всех файлах.

grep -c string *

возвращает

...
file1:1
file2:0
file3:0
...

Используя канал, я смог получить только файлы, которые имеют одно или несколько экземпляров:

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

Как я могу получить только комбинированный счет? (Если он возвращает file4:5, file5:1, file6:2, я хочу получить обратно 8.)

Ответы [ 15 ]

3 голосов
/ 12 июня 2015

Вы можете использовать простое grep, чтобы эффективно фиксировать количество вхождений. Я буду использовать опцию -i, чтобы убедиться, что STRING/StrING/string правильно захвачено.

Командная строка, которая дает имя файла:

grep -oci string * | grep -v :0

Командная строка, которая удаляет имена файлов и печатает 0, если есть файл без вхождений:

grep -ochi string *
2 голосов
/ 17 июля 2017

короткий рекурсивный вариант:

find . -type f -exec cat {} + | grep -c 'string'
1 голос
/ 15 декабря 2015

Grep единственное решение, которое я тестировал с помощью grep для windows:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

Это решение будет подсчитывать все вхождения, даже если в одной строке их несколько. -r рекурсивно ищет в каталоге, -o «покажет только часть строки, соответствующую PATTERN» - это то, что разделяет несколько вхождений в одной строке и заставляет grep печатать каждое совпадение в новой строке; затем передайте эти результаты с разделением на новую строку обратно в grep с помощью -c, чтобы подсчитать количество вхождений, используя тот же шаблон.

1 голос
/ 11 июня 2014

Вот альтернативный способ AWK, более быстрый, чем grep, который обрабатывает несколько совпадений <url> на строку в коллекции XML-файлов в каталоге:

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml

Это хорошо работает в тех случаях, когда в некоторых файлах XML нет разрывов строк.

0 голосов
/ 23 января 2014

Другой oneliner, использующий базовые функции командной строки, обрабатывающий несколько вхождений на строку.

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...