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

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唯一的解决方案,我用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,以计算使用相同模式出现的次数。

其他回答

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

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

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

cat * | grep -c string

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

短递归变体:

find . -type f -exec cat {} + | grep -c 'string'
awk -v RS='' -v FPAT='fast' '{print NF,FILENAME}' <file1..N>

取一个字符串,使其为line look instance of fast,然后打印带有文件名的字段数。

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,以计算使用相同模式出现的次数。