Grep Shell Scripting:如何计算每个子串的出现次数?

mac*_*ost 3 shell grep

Stack Overflow已经有一些关于计算字符串出现次数的好帖子(例如"foo"),就像这样:用grep计算许多文件中出现的所有字符串.但是,我一直无法找到一个稍微复杂的变种的答案.

假设我想计算foo:[*whatever*]*whatever else*文件夹中存在多少个" "的实例; 我会做:

grep -or 'foo:[(.*)]' * | wc -l
Run Code Online (Sandbox Code Playgroud)

然后我会回到"55"(或无论数量是多少).但如果我有一个像这样的文件怎么办?

foo:bar abcd
foo:baz efgh
not relevant line
foo:bar xyz
Run Code Online (Sandbox Code Playgroud)

我想知道有多少个实例foo:bar与多少个foo:baz等等?换句话说,我希望输出这东西,如:

bar 2
baz 1
Run Code Online (Sandbox Code Playgroud)

我假设有一些链接greps或使用不同命令的方法wc,但我不知道它是什么...任何shell脚本专家都有任何建议吗?

PS我意识到,如果我知道可能的子串的集合(即,如果我知道只有"foo:bar"和"foo:baz"),这将更简单,但不幸的是有一些"可以来的东西在foo:"未知之后.

Gum*_*mbo 7

你可以使用sortuniq -c:

$ grep -orE 'foo:(.*)' * | sort | uniq -c
      2 foo:bar
      1 foo:baz
Run Code Online (Sandbox Code Playgroud)