计算文件中的模式出现次数(即使在同一行)

当search文件中string的出现次数时,我通常使用:

grep pattern file | wc -l 

但是,由于grep的工作方式,每行只发现一个事件。 如何searchstring在文件中出现的次数,无论它们在相同还是不同的行上?

另外,如果我正在寻找一个正则expression式模式,而不是一个简单的string呢? 我如何计算这些数据,或者甚至更好地打印每一场比赛的新线?

要计算所有事件,请使用-o 。 尝试这个:

 echo afoobarfoobar | grep -o foo | wc -l 

man grep当然(:

更新

有些人build议只使用grep -co foo而不是grep -o foo | wc -l grep -o foo | wc -l

别。

这个快捷方式在所有情况下都不起作用。 手册页说:

 -c print a count of matching lines 

这些方法的差异如下所示:

1。

 $ echo afoobarfoobar | grep -oc foo 1 

只要在行a{foo}barfoobar )中find匹配a{foo}barfoobar ,search就会停止。 只有一行被检查和匹配,所以输出是1 。 实际上-o在这里被忽略,你可以用grep -c代替。

2。

 $ echo afoobarfoobar | grep -o foo foo foo $ echo afoobarfoobar | grep -o foo | wc -l 2 

在行( a{foo}bar{foo}bar )中find两个匹配项,因为我们明确地要求查找每个出现-o )。 每个事件都被打印在一个单独的行上,而wc -l只是计算输出中的行数。

迟到的post:
awk使用search正则expression式模式作为logging分隔符(RS)
这允许您的正则expression式跨越\n限定行(如果您需要的话)。

 printf 'X \n moo X\n XX\n' | awk -vRS='X[^X]*X' 'END{print (NR<2?0:NR-1)}' 

尝试这个:

grep“string来search”FileNameToSearch |“ cut -d“:”-f 4 | sort -n | uniq -c

示例:grep“从未知的SMTP连接”maillog | cut -d“:”-f 4 | sort -n | uniq -c

  6 SMTP connect from unknown [188.190.118.90] 54 SMTP connect from unknown [62.193.131.114] 3 SMTP connect from unknown [91.222.51.253] 

黑客grep的颜色function,并计算它打印出多less颜色标签:

 echo -e "a\nb bb\nc\ndef\nb e brb\nr" \ | GREP_COLOR="033" grep --color=always b \ | perl -e 'undef $/; $_=<>; s/\n//g; s/\x1b\x5b\x30\x33\x33/\n/g; print $_' \ | wc -l