我有一堆日志文件。我需要找出一个字符串在所有文件中出现了多少次。
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。)
我有一堆日志文件。我需要找出一个字符串在所有文件中出现了多少次。
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。)
当前回答
awk -v RS='' -v FPAT='fast' '{print NF,FILENAME}' <file1..N>
取一个字符串,使其为line look instance of fast,然后打印带有文件名的字段数。
其他回答
如果你想要每个文件的出现次数(例如字符串"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
而不是使用-c,只是将其管道到wc -l。
grep string * | wc -l
这将列出单行上的每个事件,然后计算行数。
但是,这将错过字符串在一行上出现2+次的实例。
强制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}'
请记住,此方法仍然不会在同一行上发现多次出现的字符串。
这适用于每行出现多次:
grep -o string * | wc -l