Count number of occurrences of a pattern in a file (even on same line)
count, grep, match, search
Solution
To count all occurrences, use `-o`. Try this:
echo afoobarfoobar | grep -o foo | wc -l
And `man grep` of course (:
Update
Some suggest to use just `grep -co foo` instead of `grep -o foo | wc -l`.
Don't.
This shortcut won't work in all cases. Man page says:
-c print a count of matching lines
Difference in these approaches is illustrated below:
1.
$ echo afoobarfoobar | grep -oc foo
1
As soon as the match is found in the line (`a{foo}barfoobar`) the searching stops. Only one line was checked and it matched, so the output is `1`. Actually `-o` is ignored here and you could just use `grep -c` instead.
2.
$ echo afoobarfoobar | grep -o foo
foo
foo
$ echo afoobarfoobar | grep -o foo | wc -l
2
Two matches are found in the line (`a{foo}bar{foo}bar`) because we explicitly asked to find every occurrence (`-o`). Every occurence is printed on a separate line, and `wc -l` just counts the number of lines in the output.
Problem
When searching for number of occurrences of a string in a file, I generally use: ``` grep pattern file | wc -l ``` However, this only finds one occurrence per line, because of the way grep works. How can I search for the number of times a string appears in a file, regardless of whether they are on the same or different lines? Also, what if I'm searching for a regex pattern, not a simple string? How can I count those, or, even better, print each match on a new line?