使用grep统计大量文件中出现的所有字符串

使用grep统计大量文件中出现的所有字符串,grep,Grep,我有一堆日志文件。我需要找出一个字符串在所有文件中出现的次数 grep -c string * 返回 ... file1:1 file2:0 file3:0 ... 使用管道,我只能获取具有一个或多个引用的文件: grep -c string * | grep -v :0 ... file4:5 file5:1 file6:2 ... grep -ochi string * 我怎样才能得到总数?(如果它返回file4:5、file5:1、file6:2,我想返回8。)而不是使用-c,只

我有一堆日志文件。我需要找出一个字符串在所有文件中出现的次数

grep -c string *
返回

...
file1:1
file2:0
file3:0
...
使用管道,我只能获取具有一个或多个引用的文件:

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...
grep -ochi string *

我怎样才能得到总数?(如果它返回
file4:5、file5:1、file6:2,我想返回8。)

而不是使用-c,只需将其管道连接到wc-l即可

grep string * | wc -l
这将列出单行上的每个事件,然后计算行数

但是,这将错过字符串在一行上出现2次以上的实例

cat * | grep -c string

cat

是一个罕见的有用应用程序,它适用于每行多次出现:

grep -o string * | wc -l

强制性AWK解决方案:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

如果您的文件名包括“:”尽管。

AWK解决方案也处理包括冒号在内的文件名,请注意:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
请记住,此方法仍然无法在同一行中找到多次出现的
string

grep -oh string * | wc -w

将计算一行中的多次出现次数

与前面的所有答案不同:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
perl-lne'$count++for m//g;结束{打印$count}'*

您可以添加
-R
以进行递归搜索(并避免使用cat)和
-I
以忽略二进制文件

grep -RIc string .

另一个使用基本命令行函数处理每行多个事件的oneliner

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l

下面是一种比grep AWK更快的替代方法,它在目录中的XML文件集合中处理每行的多个匹配项

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml
awk'/{m=gsub(“,”);total+=m}END{print total}some_directory/*.xml

这在某些XML文件没有换行符的情况下非常有效。

您可以使用简单的
grep
有效地捕获出现的次数。我将使用
-I
选项确保正确捕获
STRING/STRING/STRING

提供文件名称的命令行:

grep -oci string * | grep -v :0
命令行,该命令行删除文件名并在文件未出现时打印0:

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...
grep -ochi string *

我使用Grep for windows测试的仅限Grep的解决方案:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

此解决方案将统计所有事件,即使一行上有多个事件
-r
递归搜索目录,
-o
将“仅显示行匹配模式的一部分”--这是将多个事件拆分为一行并使grep在新行上打印每个匹配;然后用
-c
将这些新行分隔的结果重新导入grep,以使用相同的模式计算出现的次数。

shortrecursivevariant:

find . -type f -exec cat {} + | grep -c 'string'

如果希望每个文件出现的次数(例如字符串“tcp”):

示例输出:

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp
说明:

  • grep-RIci NEEDLE.
    -从当前目录(符号链接后)递归查找字符串NEEDLE,忽略二进制文件,计算出现次数,忽略大小写
  • awk…
    -此命令忽略出现次数为零的文件并格式化行
  • sort-hr
    -按第一列中的数字按相反顺序对行进行排序
当然,它也可以与带有选项
-c
(count)的其他grep命令一起使用。例如:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

这具有相同的限制,即它只对一行上的多次出现计数一次。不过,我猜这种行为在这种情况下是可以的。@Michael Haren是的,一行中可能只有一个字符串出现。我宁愿这样做
grep-c string不处理一行中的多个出现。如果您也要在子目录中搜索,这是行不通的,而
grep-o
wc-l
可以。cat在类似于原始问题的情况下速度更快。管道到“wc-l”与“grep-r'test”配合使用也很好。grep-r'test递归扫描当前目录下所有目录中的所有文件,查找字符串“test”。很高兴看到一种不使用grep,esp作为我的grep的方法(在windows上)不支持-o选项。这也起作用:
grep-o string*--exclude dir=some/dir/one/--exclude dir=some/dir/two | wc-l
grep-ioR string*| wc-l
是我用来执行不区分大小写、递归、仅匹配搜索的功能。这一个功能显示相关文件,然后显示匹配的总计数:
grep-rc testawk-F:'$NF>0{x+=$NF;$NF=“”;print}END{print“Total:,x}'
你能详细说明你的答案吗?再加上一点关于你提供的解决方案的描述吗?
grep-oh“…我的那咖喱很浓”*>>wc
:)你能告诉我grep-v:0是做什么的吗。我知道,对于出现次数大于0的文件,它是有效的。-v选项和:0是什么意思?。请让我知道。@GauthamHonnavara grep:0查找与字符串0匹配的行-v是一个反转搜索的选项,因此使用grep-v:0表示查找所有不包含:0的行,因此包含file4:5和file27:193的行都将通过,因为它们不包含:0您可以使用空格选择多个文件<代码>grep file1 file2--选项
谢谢!只有你的解决方案对我有效(总结了所有文件的匹配)。太棒了!工作得很有魅力。节省时间。非常感谢你。