我有一堆日志文件。我需要找出一个字符串在所有文件中出现了多少次。
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 -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。)
当前回答
您可以添加-R来递归搜索(并避免使用cat)和-I来忽略二进制文件。
grep -RIc string .
其他回答
而不是使用-c,只是将其管道到wc -l。
grep string * | wc -l
这将列出单行上的每个事件,然后计算行数。
但是,这将错过字符串在一行上出现2+次的实例。
另一个使用基本命令行函数处理每行多个事件的联机程序。
cat * |sed s/string/\\\nstring\ /g |grep string |wc -l
grep -oh string * | wc -w
将计数在一行中多次出现
AWK解决方案还处理包含冒号的文件名:
grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
请记住,此方法仍然不会在同一行上发现多次出现的字符串。
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,以计算使用相同模式出现的次数。