使用grep计算大量文件中的所有string

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

grep -c string * 

回报

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

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

 grep -c string * | grep -v :0 ... file4:5 file5:1 file6:2 ... 

我怎样才能得到合计的计数? (如果它返回file4:5, file5:1, file6:2 ,我想返回8.)

 cat * | grep -c string 

这适用于每行多个事件:

 grep -o string * | wc -l 
 grep -oh string * | wc -w 

将在一行中计数多个事件

而不是使用-c,只需将其input到wc -l。

 grep string * | wc -l 

这将在一行中列出每个事件,然后计算行数。

尽pipe如此,这将会错过在一行上出现2+次的情况。

 cat * | grep -c string 

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

与之前所有答案不同的是:

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

强制AWK解决scheme:

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

尽pipe如果你的文件名包括“:”请注意。

AWK解决scheme还处理包括冒号在内的文件名:

 grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}' 

请记住,此方法仍然不会在同一行中find多个string

您可以添加-Rrecursionsearch(而不是使用猫)和-I忽略二进制文件。

 grep -RIc string . 

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

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

grep只有解决scheme,我用grep for windowstesting:

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

即使在一条线上有多个,这个解决scheme也会计算所有的事件。 -rrecursion地search目录, -o将“只显示匹配PATTERN的行的一部分” – 这是在一行上分割多个事件并且使得grep在新行上打印每个匹配; 然后使用-c将这些换行符分隔的结果传回到grep,以使用相同的模式计算出现次数。

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

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

这适用于某些XML文件没有换行符的情况。

您可以使用简单的grep来有效捕获事件的数量。 我将使用-i选项来确保正确捕获STRING/StrING/string

提供文件名称的命令行:

 grep -oci string * | grep -v :0 

删除文件名并打印0的命令行,如果有文件没有发生:

 grep -ochi string * 

recursion变体:

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