При поиске количества случаев строки в файле я обычно использую:
grep pattern file | wc -l
Однако это только находит одно возникновение на строку из-за пути grep работы. Как я могу искать количество раз, строка появляется в файле, независимо от того, являются ли они на тех же или различных строках?
Кроме того, что, если я ищу regex шаблон, не простую строку? Как я могу считать их, или, еще лучше, распечатать каждое соответствие на новой строке?
Чтобы подсчитать все вхождения, используйте -o
. Попробуйте следующее:
echo afoobarfoobar | grep -o foo | wc -l
И man grep
, конечно (:
Некоторые предлагают использовать только 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
просто подсчитывает количество строк в выводе.
Взломайте функцию цвета 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