使用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也会计算所有的事件。 -r
recursion地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'