Считать количество вхождений шаблона в файле (даже на одной строке)
При поиске количества вхождений строки в файл я обычно использую:
grep pattern file | wc -l
Тем не менее, это только находит одно вхождение в строке, из-за того, как работает grep. Как я могу найти количество строк, появляющихся в файле, независимо от того, находятся ли они в одной или нескольких строках?
Кроме того, что, если я ищу шаблон регулярного выражения, а не простую строку? Как я могу считать эти или даже лучше распечатать каждое соответствие на новой строке?
Ответы
Ответ 1
Чтобы подсчитать все вхождения, используйте -o
. Попробуйте следующее:
echo afoobarfoobar | grep -o foo | wc -l
И man grep
, конечно (:
Update
Некоторые предлагают использовать только grep -co foo
вместо grep -o foo | wc -l
.
Не.
Этот ярлык не будет работать во всех случаях. Страница "Человек" говорит:
-c print a count of matching lines
Различие в этих подходах показано ниже:
1.
$ echo afoobarfoobar | grep -oc foo
1
Как только совпадение найдено в строке (a{foo}barfoobar
), поиск останавливается. Была проверена только одна строка, и она соответствовала, поэтому на выходе 1
. На самом деле -o
здесь игнорируется, и вы можете просто использовать grep -c
вместо этого.
2.
$ echo afoobarfoobar | grep -o foo
foo
foo
$ echo afoobarfoobar | grep -o foo | wc -l
2
В строке (a{foo}bar{foo}bar
) найдено два совпадения, потому что мы явно просили найти каждое событие (-o
). Каждое появление печатается на отдельной строке, а wc -l
просто подсчитывает количество строк на выходе.
Ответ 2
Запоздалая почта:
Используйте шаблон регулярного выражения поиска в качестве разделителя записи (RS) в awk
Это позволяет вашему регулярному выражению охватывать строки \n
-delimited (если вам это нужно).
printf 'X \n moo X\n XX\n' |
awk -vRS='X[^X]*X' 'END{print (NR<2?0:NR-1)}'
Ответ 3
Попробуйте следующее:
grep "для поиска" FileNameToSearch | cut -d ":" -f 4 | sort -n | uniq -c
Пример:
grep "SMTP connect from unknown" maillog | cut -d ":" -f 4 | sort -n | uniq -c
6 SMTP connect from unknown [188.190.118.90]
54 SMTP connect from unknown [62.193.131.114]
3 SMTP connect from unknown [91.222.51.253]
Ответ 4
Взломайте функцию цвета grep и подсчитайте, сколько цветных тегов она выдает:
echo -e "a\nb b b\nc\ndef\nb e brb\nr" \
| GREP_COLOR="033" grep --color=always b \
| perl -e 'undef $/; $_=<>; s/\n//g; s/\x1b\x5b\x30\x33\x33/\n/g; print $_' \
| wc -l