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

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。)


当前回答

cat * | grep -c string

其他回答

您可以使用简单的grep来有效地捕获出现的数量。我将使用-i选项来确保STRING/ STRING/ STRING被正确捕获。

给出文件名称的命令行:

grep -oci string * | grep -v :0

命令行,删除文件名,如果文件没有出现,则打印0:

grep -ochi string *
cat * | grep -c string
cat * | grep -c string

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

另一个使用基本命令行函数处理每行多个事件的联机程序。

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

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

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

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