grepshell脚本:如何计算每个子字符串的出现次数?

grepshell脚本:如何计算每个子字符串的出现次数?,shell,grep,Shell,Grep,Stack Overflow已经发布了一些关于计算字符串出现次数(例如“foo”)的好帖子,比如下面这篇:。然而,我一直无法找到一个更复杂的变体的答案 假设我想计算文件夹中存在多少“foo:[*whater*]*whater*”实例;我会: grep -or 'foo:[(.*)]' * | wc -l 而我会得到“55”(或任何计数)。但如果我有一个文件,比如: foo:bar abcd foo:baz efgh not relevant line foo:bar xyz 我想计算一下有多

Stack Overflow已经发布了一些关于计算字符串出现次数(例如“foo”)的好帖子,比如下面这篇:。然而,我一直无法找到一个更复杂的变体的答案

假设我想计算文件夹中存在多少“
foo:[*whater*]*whater*
”实例;我会:

grep -or 'foo:[(.*)]' * | wc -l
而我会得到“55”(或任何计数)。但如果我有一个文件,比如:

foo:bar abcd
foo:baz efgh
not relevant line
foo:bar xyz
我想计算一下有多少个
foo:bar
vs.有多少个
foo:baz
s,等等。?换句话说,我希望输出类似于:

我假设有某种方法可以链接
grep
s,或者使用与
wc
不同的命令,但我不知道它是什么。。。有没有shell脚本专家有什么建议


另外,我意识到,如果我知道可能的子字符串集(即,如果我知道只有“foo:bar”和“foo:baz”),这会更简单,但不幸的是,有一组“foo:foo:之后可能出现的事情”是未知的。

你可以使用
排序
uniq-c

$ grep -orE 'foo:(.*)' * | sort | uniq -c
      2 foo:bar
      1 foo:baz

太棒了,谢谢你。。。不过我担心我的原始问题过于笼统了。在灰色文本之后还有潜在的(不相关的)文本,我想那文本会把
uniq
搞得一团糟?我已尝试编辑问题以使其更清晰。@machineghost
-o
应只提供实际匹配的文本。如果匹配的部分太多,请使用除
*
以外的模式。@MachineHost是的,请尝试类似
\S+
(一个或多个非空白字符)的方式,而不是
*
。明白了(在我的实际情况中,我使用了一个闭包作为边界,因此我最终执行
foo\([^]+\)
)。
$ grep -orE 'foo:(.*)' * | sort | uniq -c
      2 foo:bar
      1 foo:baz