我正在读一个活动日志,并试图接到一些特殊的电话
$ tail -f example.log | egrep 'pattern1|pattern2|pattern3|pattern4|pattern5'但是有几个模式几乎没有被打印出来(由于开发流程),而另一个模式是非常连续地打印的。
如何使egrep只为每个模式打印一个请求,这样我就可以很容易地看到它们工作得很好。
发布于 2016-08-03 19:41:31
你可以这样做:
tail -f example.log | awk '
BEGIN {
n = split("pattern1,pattern2,pattern3,pattern4,pattern5", pats, /,/)
}
{
found=0
for (i in pats) if ($0 ~ pats[i]) {
found=1
delete pats[i]
n--
}
}
found {print; if (!n) exit}'注意,awk一看到所有的模式就会退出,但是tail只会在下次它写东西之后才退出( SIGPIPE)。
或者,如果行可能与几个模式不匹配,如果您不关心在找到所有模式时退出,则更短但效率更低:
awk '/pattern1/&&!a++ || /pattern2/&&!b++ || /pattern3/&&!c++ || \
/pattern4/&&!d++ || /pattern5/&&!e++'使用zsh和GNU grep:
(trap '' PIPE;tail -f example.log > >(grep -m1 pattern1) \
> >(grep -m1 pattern2) \
> >(grep -m1 pattern3) \
> >(grep -m1 pattern4) \
> >(grep -m1 pattern5))但是请注意,匹配多个模式的行将被打印很多次。
发布于 2016-08-03 19:44:20
我相信你要的是-o,它只会打印出匹配的部分。然后,您可以进行以下操作:
cat example.log | egrep -o 'pat1|pat2|pat3|pat4|pat5' | sort | uniq如果输出包含一个模式,那是因为至少有一行与该模式匹配。如果输出包含所有5个模式,则每个模式至少匹配一行。
不适用于可以匹配不同字符或不同长度匹配的正则表达式。
https://unix.stackexchange.com/questions/300115
复制相似问题