grepshell脚本:如何计算每个子字符串的出现次数?
Stack Overflow已经发布了一些关于计算字符串出现次数(例如“foo”)的好帖子,比如下面这篇:。然而,我一直无法找到一个更复杂的变体的答案 假设我想计算文件夹中存在多少“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 我想计算一下有多
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