我想计算目录中匹配的数量。
grep -rn 'hello' .
工作正常,打印行号并递归地遍历当前目录。
grep -rc 'hello' .
另一方面,似乎打印出当前目录中的每个文件而不返回计数。
有一个类似的问题和答案grep -r <pattern> <directory>
这显示了一种通过管道传输to的结果来做到这一点的方法wc -l
,但我想知道为什么我上面的命令不起作用,以及是否有一种方法可以仅使用 grep 选项来做到这一点。
答案1
这是预料之中的。
grep -r -n
将执行递归grep
,显示与给定模式匹配的行,并以文件名和行号为前缀。它会为您提供每个文件中匹配的每一行。
-n
每个输出行前面都有其在文件中的相对行号,从第 1 行开始。对于每个处理的文件,行号计数器都会重置。
grep -r -c
将执行递归grep
,显示所有考虑的文件的文件名,后跟该文件中模式的匹配数。它将为每个文件提供一行。
-c
仅将所选行的计数写入标准输出。
要获取特定目录中任何文件中模式的匹配数(递归地),您可以将结果提供grep -r
为wc -l
在您链接到的答案中建议:
$ grep -r 'pattern' . | wc -l
到只使用grep
为了达成这个:
$ grep -r 'pattern' . | grep -c 'pattern'
wc
尽管当使用正则表达式引擎来计算换行符是“适合这项工作的工具”时,使用正则表达式引擎来完成这项工作肯定是矫枉过正。
请注意,还有一个-o
标志grep
:
-o
打印每个匹配项,但仅打印匹配项,而不是整行。
如果您想分别计算每行上的每个单独的匹配项,这可能很有用:
$ grep -r -o 'pattern' . | wc -l
例如,比较以下两个grep
调用(在bash
或 中ksh93
):
$ grep 'l' <<<"Hello world!" | wc -l
1
$ grep -o 'l' <<<"Hello world!" | wc -l
3