使用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--选项
谢谢!只有你的解决方案对我有效(总结了所有文件的匹配)。太棒了!工作得很有魅力。节省时间。非常感谢你。