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

grep -c string *

返回

...
file1:1
file2:0
file3:0
...

使用管道,我只能得到有一个或多个事件的文件:

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

我如何才能得到只有合并计数?(如果它返回file4:5, file5:1, file6:2,我想返回8。)


当前回答

如果你想要每个文件的出现次数(例如字符串"tcp"):

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

示例输出:

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 -按第一列的数字倒序排序

当然,它也可以与其他grep命令一起使用选项-c (count)。例如:

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

其他回答

grep -oh string * | wc -w

将计数在一行中多次出现

cat * | grep -c string

cat的一个罕见的有用应用。

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

grep -RIc string .
cat * | grep -c string

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

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

这在某些XML文件没有换行符的情况下工作得很好。