首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何打印一个匹配的grep时尾部-f?

如何打印一个匹配的grep时尾部-f?
EN

Unix & Linux用户
提问于 2016-08-03 19:27:56
回答 2查看 1.6K关注 0票数 5

我正在读一个活动日志,并试图接到一些特殊的电话

代码语言:javascript
运行
复制
$ tail -f example.log | egrep 'pattern1|pattern2|pattern3|pattern4|pattern5'

但是有几个模式几乎没有被打印出来(由于开发流程),而另一个模式是非常连续地打印的。

如何使egrep只为每个模式打印一个请求,这样我就可以很容易地看到它们工作得很好。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2016-08-03 19:41:31

你可以这样做:

代码语言:javascript
运行
复制
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)。

或者,如果行可能与几个模式不匹配,如果您不关心在找到所有模式时退出,则更短但效率更低:

代码语言:javascript
运行
复制
awk '/pattern1/&&!a++ || /pattern2/&&!b++ || /pattern3/&&!c++ || \
     /pattern4/&&!d++ || /pattern5/&&!e++'

使用zsh和GNU grep

代码语言:javascript
运行
复制
(trap '' PIPE;tail -f example.log > >(grep -m1 pattern1) \
                                  > >(grep -m1 pattern2) \
                                  > >(grep -m1 pattern3) \
                                  > >(grep -m1 pattern4) \
                                  > >(grep -m1 pattern5))

但是请注意,匹配多个模式的行将被打印很多次。

票数 6
EN

Unix & Linux用户

发布于 2016-08-03 19:44:20

我相信你要的是-o,它只会打印出匹配的部分。然后,您可以进行以下操作:

代码语言:javascript
运行
复制
cat example.log | egrep -o 'pat1|pat2|pat3|pat4|pat5' | sort | uniq

如果输出包含一个模式,那是因为至少有一行与该模式匹配。如果输出包含所有5个模式,则每个模式至少匹配一行。

不适用于可以匹配不同字符或不同长度匹配的正则表达式。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/300115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档