Ответ 1
cat * | grep -c string
У меня есть куча файлов журналов. Мне нужно узнать, сколько раз строка возникает во всех файлах.
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
, я хочу вернуться назад.)
cat * | grep -c string
Это работает для нескольких вхождений в строке:
grep -o string * | wc -l
grep -oh string * | wc -w
будет считать несколько вхождений в строке
Вместо использования -c просто подключите его к wc -l.
grep string * | wc -l
Это будет отображать каждое вхождение в одной строке, а затем подсчитывать количество строк.
Это пропустит экземпляры, где строка встречается 2 раза в одной строке.
cat * | grep -c string
Одно из редких полезных приложений cat
.
Что-то другое, чем все предыдущие ответы:
perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
Обязательное решение AWK:
grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'
Позаботьтесь, если ваши имена файлов включают в себя: ".".
Решение AWK, которое также обрабатывает имена файлов, включая двоеточия:
grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
Имейте в виду, что этот метод все еще не находит несколько вхождений string
в одну строку.
Вы можете добавить -R для поиска рекурсивно (а не использовать cat) и -I для игнорирования двоичных файлов.
grep -RIc string .
короткий рекурсивный вариант:
find . -type f -exec cat {} + | grep -c 'string'
Еще один oneliner, используя основные функции командной строки, обрабатывающие несколько вводов в строке.
cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
Ниже приведен альтернативный способ AWK, отличный от grep, который обрабатывает несколько совпадений <url>
на строку в коллекции XML файлов в каталоге:
awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml
Это хорошо работает в случаях, когда некоторые файлы XML не имеют разрывов строк.
Вы можете использовать простой grep
, чтобы эффективно регистрировать количество вхождений. Я буду использовать параметр -i
, чтобы убедиться, что STRING/StrING/string
зафиксирован правильно.
Командная строка, которая дает имя файла:
grep -oci string * | grep -v :0
Командная строка, которая удаляет имена файлов и печатает 0, если есть файл без вхождений:
grep -ochi string *
Единственное решение 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
, чтобы подсчитать количество вхождений с использованием одного и того же шаблона.