正则表达式搜索模式并输出多行直到另一个模式

时间:2017-06-13 07:23:20

标签: regex perl awk pcregrep

我有一个日志文件,其中每个日志都遵循一种模式:
日期[FLAG] LogRequestID:内容

每个日志的内容部分可能跨越多行。给定一个LogRequestID,我需要搜索所有出现的事件,并获取整个日志。我需要使用perl,awk,sed或pcregrep来完成。

示例输入(注意日志之间没有空行):

  

2017年5月24日17:00:06,827 [INFO] 123456(Blah:Blah1)服务名称::单行内容

     

2017年5月24日17:00:06,828 [INFO] 567890(Blah:Blah1)服务名称::内容(可能跨越多行)

     

2017年5月24日17:00:06,829 [INFO] 123456(Blah:Blah2)   服务名称:多行内容。打印对象[ID1 = fac-adasd   ID2 = 123231
  ID3 = 123108状态=未知
  代码= 530007 Dest = CA
  ]

     

2017年5月24日17:00:06,830 [INFO] 123456(Blah:Blah1)服务名称::单行内容

     

2017年5月24日17:00:06,831 [INFO] 567890(Blah:Blah2)服务名称::内容(可跨越多行)

鉴于搜索键123456,我想提取以下内容:

  

2017年5月24日17:00:06,827 [INFO] 123456(Blah:Blah1)服务名称::单行内容

     

2017年5月24日17:00:06,829 [INFO] 123456(Blah:Blah2)   服务名称:多行内容。打印对象[ID1 = fac-adasd   ID2 = 123231
  ID3 = 123108状态=未知
  代码= 530007 Dest = CA
  ]

     

2017年5月24日17:00:06,830 [INFO] 123456(Blah:Blah1)服务名称::单行内容

使用grep为我提供单行日志,但只给出了部分多行日志。

我尝试在搜索模式之后检查几行,使用awk,并检查是否已达到另一个日志,但它变得效率低下。我需要某种可以与pcregrep或perl甚至awk一起使用的正则表达式来获取此输出。

请帮助我,因为我对正则表达式很不好。

1 个答案:

答案 0 :(得分:0)

怎么样:

awk '/[0-9]{2}[[:space:]][[:alnum:]_]+[[:space:]][0-9]{4}/{ n = 0 }/123456/{ n = 1 }n' file

输出:

    24 May 2017 17:00:06,827 [INFO] 123456 (Blah : Blah1) Service-name:: Single line content

    24 May 2017 17:00:06,829 [INFO] 123456 (Blah : Blah2) Service-name: Multiple line content. Printing Object[ ID1=fac-adasd ID2=123231
    ID3=123108 Status=Unknown
    Code=530007 Dest=CA
    ]

    24 May 2017 17:00:06,830 [INFO] 123456 (Blah : Blah1) Service-name:: Single line content

开头的正则表达式匹配每个条目开头的日期,并将n设置为零。但是当行中有您想要的ID时,n被设置为1并且所有内容都会打印到下一个日期。