2008-12-16 71 views
225

我有一堆日志文件。我需要找出一个字符串在所有文件中出现的次数。使用grep计算大量文件中的所有字符串

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

+0

你能告诉我是什么的grep -v:0呢? 。我知道它对出现大于0的文件很重要。-v选项和:0是什么意思?请让我知道。 – 2017-05-09 17:57:04

+0

@GauthamHonnavara grep:0查找与字符串匹配的行:0。 -v是反转该搜索的选项,因此改为使用grep -v:0表示找到所有不包含的行:0,因此file4:5和file27:193的所有行都会通过,因为它们不包含: 0 – penguin359 2017-05-16 17:56:05

回答

230
cat * | grep -c string 
+7

这具有相同的局限性,即它只在一行上计算多次出现次数。不过,我猜这种行为在这种情况下是可以的。 – 2008-12-16 12:22:00

+0

@迈克尔哈伦是的,一行中只能出现一次字符串。 – 2008-12-16 12:25:56

+2

我宁愿做`grep -c string <*`所以只需用小于的空格替换空格即可。 – 2012-01-04 02:08:37

19

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

grep string * | wc -l 

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

虽然这会错过字符串在一行出现2+次的情况。

+2

配管到“wc -l”也很好地与“grep -r'测试”一起工作。“它递归地扫描当前文件下所有目录中字符串'test'的所有文件。 – nottinhill 2011-12-13 15:07:17

13
cat * | grep -c string 

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

256

这适用于每行多次出现:

grep -o string * | wc -l 
6

强制性AWK解决方案:

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

小心,如果你的文件名包括 “:” 虽然。

5

的AWK的解决方案,还可以处理文件名,包括冒号:

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

请记住,这种方法仍然没有找到在同一行的string多次出现。

23
grep -oh string * | wc -w 

将计算多次出现在一条线上

9

东西比以前所有的答案不同:

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

您可以添加-R递归搜索(而不是使用CAT)和-I忽略二进制文件。

grep -RIc string . 
0

使用基本命令行函数的另一个oneliner函数每行处理多个出现。

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

这里是这样做的速度快于grep的AWK的替代方式,它处理的<url>每行多个匹配的XML文件的集合中的一个目录:

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

该作品以及在某些XML文件没有换行符的情况下。

0

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

命令行,使该文件的名称:

grep -oci string * | grep -v :0 

命令行删除的文件名,并打印0如果不出现一个文件:

grep -ochi string * 
1

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

2

递归变种:

find . -type f -exec cat {} + | grep -c 'string' 
相关问题