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