Подсчитайте все вхождения строки в большом количестве файлов с помощью grep

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

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, я хочу вернуться назад.)

Ответ 1

cat * | grep -c string

Ответ 2

Это работает для нескольких вхождений в строке:

grep -o string * | wc -l

Ответ 3

grep -oh string * | wc -w

будет считать несколько вхождений в строке

Ответ 4

Вместо использования -c просто подключите его к wc -l.

grep string * | wc -l

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

Это пропустит экземпляры, где строка встречается 2 раза в одной строке.

Ответ 5

cat * | grep -c string

Одно из редких полезных приложений cat.

Ответ 6

Что-то другое, чем все предыдущие ответы:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *

Ответ 7

Обязательное решение AWK:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

Позаботьтесь, если ваши имена файлов включают в себя: ".".

Ответ 8

Решение AWK, которое также обрабатывает имена файлов, включая двоеточия:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'

Имейте в виду, что этот метод все еще не находит несколько вхождений string в одну строку.

Ответ 9

Вы можете добавить -R для поиска рекурсивно (а не использовать cat) и -I для игнорирования двоичных файлов.

grep -RIc string .

Ответ 10

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

find . -type f -exec cat {} + | grep -c 'string'

Ответ 11

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

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l

Ответ 12

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

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

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

Ответ 13

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

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

grep -oci string * | grep -v :0

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

grep -ochi string *

Ответ 14

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

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

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