Чтобы подсчитать все вхождения, используйте -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 -o foo a.txt b.txt | sort | uniq -c
отлично работает (с GNU grep): gist.github.com/hudolejev/81a05791f38cbacfd4de3ee3b44eb4f8Попробуй это:
Образец:
источник
Запоздалый пост:
используйте шаблон регулярного выражения поиска в качестве разделителя записей (RS).
awk
Это позволяет вашему регулярному выражению охватывать
\n
ограниченные строки (если вам это нужно).источник
Ripgrep , быстрая альтернатива grep, только что представил
--count-matches
флаг, позволяющий подсчитывать каждое совпадение в версии 0.9 (я использую приведенный выше пример, чтобы оставаться последовательным):По просьбе OP, ripgrep также позволяет использовать шаблон регулярного выражения (
--regexp <PATTERN>
). Также он может выводить каждое совпадение (строку) в отдельной строке:источник
Взломайте функцию цвета grep и посчитайте, сколько цветных тегов она распечатает:
источник