如何使用 Linux 的 grep 计算字符串的所有匹配项

grep
是一种文本搜索实用程序,可以同时处理标准输入或多个文件。它用于打印模式、字符串或正则表达式的匹配项。计算匹配次数通常很有用,grep
可以很容易地做到这一点。
使用 grep 计算匹配项
grep
命令具有 -c
标志,它将计算匹配的行数并打印出一个数字。这对很多事情都很有用,例如通过日志文件搜索来自粒子 IP、端点或其他标识符的条目数。
grep -c "1.2.3.4" /var/log/nginx/access.log

但是,grep
能够每行匹配多次。如果您使用 -o
标志,grep
将为每个匹配打印出一个新行。这不适用于 -c
标志,因为它只会计算匹配的 行,而不是每行的多个匹配项。
更好的解决方案是将 wc
(字数统计)实用程序与 -l
(行数)参数一起使用,它将计算原始字数通过标准输入传递给它的行。使用 wc -l
是首选解决方案,因为它与 -o
一起使用以计算给定字符串或模式在整个文件中出现的次数。
grep -o "foo" file | wc -l

跨多个文件计数
grep
的一个很好的特性是能够同时处理多个文件,这些文件可以通过 xargs
、参数传递,也可以通过通配符扩展提供。处理多个文件时,grep
会在匹配前打印出文件名。当使用 -c
计算匹配行数时,它还会打印出文件名:
grep "foo" ./*.txt -cH

在处理多个文件的可能性时,您应该始终使用 -H
标志,因为即使只有一个文件传递给 grep
,它也会始终打印文件名。如果您依赖于那里的文件名,这将防止自动化中断。
如果您想使用 -o
计算每行的多个匹配项,并将输出传递给 wc -l
,您将无法看到每个单独文件的编号与 -c
类似。但是,通过一些脚本,您可以使用 cut
截断第一列,并使用 uniq -c
计算每个文件名的唯一出现次数:
grep "foo" ./*.txt -o | cut -d ':' -f 1 | uniq -c
