我有一堆日志文件。我需要找出一个字符串在所有文件中出现了多少次。
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。)
file4:5, file5:1, file6:2
而不是使用-c,只是将其管道到wc -l。
grep string * | wc -l
这将列出单行上的每个事件,然后计算行数。
但是,这将错过字符串在一行上出现2+次的实例。
cat * | grep -c string
cat的一个罕见的有用应用。
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。
string
grep -oh string * | wc -w
将计数在一行中多次出现
一些不同于之前所有答案的问题:
perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
你可以添加-R来递归搜索(并避免使用cat)和-I来忽略二进制文件。
-R
-I
grep -RIc string .
另一个使用基本命令行函数处理每行多个事件的联机程序。
cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
下面是一个比grep更快的AWK替代方法,它在一个目录中的XML文件集合中处理每行<url>的多个匹配:
<url>
awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml
这在某些XML文件没有换行符的情况下工作得很好。
您可以使用简单的grep来有效地捕获出现的数量。我将使用-i选项来确保正确捕获STRING/StrING/string。
grep
-i
STRING/StrING/string
给出文件名称的命令行:
grep -oci string * | grep -v :0
命令行,删除文件名,如果文件没有出现,则打印0:
grep -ochi string *
Grep唯一的解决方案,我用Grep测试windows:
grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"
这个解决方案将计算所有发生的情况,即使在一行上有多个。-r递归搜索目录,-o将“只显示一行匹配PATTERN的部分”——这就是在单行上分割多个出现,并使grep在新行上打印每个匹配;然后用-c将这些换行分隔的结果输送回grep,以计算使用相同模式出现的次数。
-r
-o
-c
短递归变体:
find . -type f -exec cat {} + | grep -c 'string'
如果你想要每个文件的出现次数(例如字符串"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 .
awk ...
sort -hr
当然,它也可以与其他带有选项-c (count)的grep命令一起使用。例如:
grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr
awk -v RS='' -v FPAT='fast' '{print NF,FILENAME}' <file1..N>
取一个字符串,使其为line look instance of fast,然后打印带有文件名的字段数。