Answers:
要计算所有出现的次数,请使用-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
。实际上-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
)。每次出现都打印在单独的行上,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]
Ripgrep是grep的快速替代方案,它刚刚引入了该--count-matches
标志,允许对0.9版中的每个匹配进行计数(我使用上面的示例保持一致):
> 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