Для підрахунку всіх випадків використовуйте -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просто підраховується кількість рядків у вихідних даних.