Количество количества случаев шаблона в файле (даже на той же строке)

При поиске количества случаев строки в файле я обычно использую:

grep pattern file | wc -l

Однако это только находит одно возникновение на строку из-за пути grep работы. Как я могу искать количество раз, строка появляется в файле, независимо от того, являются ли они на тех же или различных строках?

Кроме того, что, если я ищу regex шаблон, не простую строку? Как я могу считать их, или, еще лучше, распечатать каждое соответствие на новой строке?

90
задан Amit G 19 June 2015 в 12:31
поделиться

2 ответа

Чтобы подсчитать все вхождения, используйте -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 просто подсчитывает количество строк в выводе.

150
ответ дан 24 November 2019 в 07:04
поделиться

Взломайте функцию цвета 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
-1
ответ дан 24 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: