如何从文件夹中的所有文件中获取匹配特定字符串的行数统计

6
问题描述:我有一个文件夹,其中包含许多文本文件。我想在该文件夹中的所有文件中搜索特定字符串,例如“string_example”。然后,我应该得到所有具有字符串“string_example”的行的总行数。这意味着如果第一个文本文件中有5个匹配行,在第二个文本文件中有10个匹配行,在第三个文本文件中有3个匹配行。那么输出应为5+10+3=18。
我的尝试:我浏览了互联网,并找到了一些命令,例如:
grep -r -n ".string_example" .
这个bash命令将打印包含字符串“string_example”的行的文件名以及行号。以下是更好理解的示例输出:
第一个文件:1:string_example is there 第一个文件:2:string_example is not there 第二个文件:1:string_example is there 等等……但我真正想要的输出是上面输出中的3。
我也尝试了一些其他的bash命令,但没有用处。
我的问题:是否有任何适用于此类目的bash命令。如果没有,如何编写符合以下要求的脚本。
请帮帮我。

1
阅读您的标题,我无法理解您需要“包含字符串的所有文件(引用文件)中的总行数”还是“包含字符串的所有文件(引用行)中的总行数”。从您的问题文本中,“如果第一个文本文件中有5行”,似乎更像是文件中的总行数,但是您可能省略了一些内容,意思是“如果第一个文本文件中有5个匹配行”,所以我很困惑:您需要总行数还是匹配行数的总和? - gboffi
谢谢您的评论,我会相应地进行编辑! - Sudhir kumar
如果我错了,我建议同时更改标题,使用类似于“...总共有匹配的行数在...”的内容。顺便说一下,我不是以英语为母语的人,但是“包含s的所有文件”,这不奇怪吗? - gboffi
4个回答

14
你可以把grep命令和wc -l命令串联起来,以获取包含你的关键字的行数:
grep -r "string_example" . | wc -l

请问您能解释一下 wc -l 命令的作用吗? - Sudhir kumar
2
@SUDHIR:wc -l 可以计算给定输入中的行数。 - anubhava
1
如果从 grep -r 中获取了大量输出,则执行 grep -hrc "string-example" . | awk '{sum += $1} END { print sum }' 可能更经济,因为 grep 的输出将仅是每个文件的聚合,而不是每个匹配项。另一方面,对于没有包含匹配项的每个文件,它将包括一个零。 - tripleee
1
你需要使用 --only-matching 来覆盖单行中可能出现的多个匹配项, grep -r --only-matching "string_example" . | wc -l - Baris Demiray
但是 grep 只会显示单个匹配给定模式,即使找到多个匹配项。 - anubhava

4
您也可以使用awk来完成此操作:
awk '/string_example/{++c}END{print c}' *

每当一行与模式匹配时,c 就会增加一次。当所有文件都已读取完毕后,打印出总计数。


2
你希望得到这样的东西吗?
grep -l string_example *|xargs wc -l

编辑:
您想获得所有文件中匹配行数的总和,还是包含匹配行的文件中的总行数?

我想要获取所有文件中匹配的行数。 - Sudhir kumar

0

通过在 shell 提示符下输入此命令,您将

% find -type f -name \*.h | xargs grep -l stdlib  | xargs wc -l | awk '{a+=$1} END{print a}'
16372
% 
  1. 获取所有以.h结尾的文件列表,包括当前目录和子目录下的文件。
  2. 在这些文件中使用grep查找对stdlib的引用,并通过选项-l仅打印(一次)至少有一个匹配项的文件名。
  3. 将文件名列表传递给wc -l
  4. 使用awk对每个文件的行数进行求和。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接