计算文件中的模式出现次数(即使在同一行)
当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