回答:
すべての発生をカウントするには、を使用します-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行だけがチェックされ、一致したため、出力は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
)を見つけるように明示的に要求したため、行()で2つの一致が見つかりました。すべての発生は別の行にwc -l
出力され、出力の行数を数えるだけです。
grep -o foo a.txt b.txt | sort | uniq -c
うまく機能します(GNU grepを使用):gist.github.com/hudolejev/81a05791f38cbacfd4de3ee3b44eb4f8
これを試して:
grep "string to search for" FileNameToSearch | cut -d ":" -f 4 | sort -n | uniq -c
サンプル:
grep "SMTP connect from unknown" maillog | cut -d ":" -f 4 | sort -n | uniq -c
6 SMTP connect from unknown [188.190.118.90]
54 SMTP connect from unknown [62.193.131.114]
3 SMTP connect from unknown [91.222.51.253]
grepの高速代替手段であるRipgrepは、バージョン0.9で各一致--count-matches
をカウントできるフラグを導入しました(一貫性を保つために上記の例を使用しています)。
> echo afoobarfoobar | rg --count foo
1
> echo afoobarfoobar | rg --count-matches foo
2
OPからの質問のとおり、ripgrepでは正規表現パターンも使用できます(--regexp <PATTERN>
)。また、各(行)の一致を別の行に出力することもできます。
> echo -e "line1foo\nline2afoobarfoobar" | rg foo
line1foo
line2afoobarfoobar