首页 > 解决方案 > grep/awk/sed 有状态行匹配

问题描述

我有一个日志文件,其中包含本身可以拆分为多行的条目,我想找到这些条目的所有实例。

例如:

AAA normal line
BBB normal line
XXX important line
 important line continuation 1
 important line continuation 2
BBB normal line
 normal line continuation 1
AAA normal line
XXX important line
 important line continuation 1
 important line continuation 2
 important line continuation 3
AAA normal line

所有条目都以代码开头(AAA、BBB、XXX 等)。以代码 XXX 开头的行及其相关的续行是我感兴趣的行。续行以空格开头,并且可以有任意数量的续行。续行之后的行可以以任何代码开头。

我认为这是一种“有状态”匹配(尽管它可能无法通过这种方式解决)......即:我想要匹配模式 XXX 的行,然后所有紧跟在以空格开头的行(直到他们没有) .

在跟踪日志文件的同时,我该如何 grep、sed 或 awk?

更新:示例期望结果:

XXX important line
 important line continuation 1
 important line continuation 2
XXX important line
 important line continuation 1
 important line continuation 2
 important line continuation 3

标签: awksedgrepstateful

解决方案


awk应该有效:

awk '/^[^ \t]/{p = ($1 == "XXX")} p' file

XXX important line
 important line continuation 1
 important line continuation 2
XXX important line
 important line continuation 1
 important line continuation 2
 important line continuation 3

命令解释:

  • /^[^ \t]/: 条件,如果一行不以空格或制表符开头
  • {: 启动动作块
  • p = ($1 == "XXX"):如果第一列设置p为 ,则设置为。1XXX0
  • }: 结束块
  • p:如果p==1则打印行

p1当我们找到时将设置为$1 == XXX,我们将继续打印行直到再次p变为0


推荐阅读