正则表达式搜索模式并输出多行直到另一个模式
regex to search pattern and output multiple lines until another pattern
我有一个日志文件,其中每个日志都遵循一种模式:
日期 [FLAG] LogRequestID:内容
每个日志的内容部分可能跨越多行。给定一个 LogRequestID,我需要搜索所有事件,并获取整个日志。我需要使用 perl、awk、sed 或 pcregrep 来完成此操作。
示例输入(注意日志之间没有空行):
24 May 2017 17:00:06,827 [INFO] 123456 (Blah : Blah1) Service-name:: Single line content
24 May 2017 17:00:06,828 [INFO] 567890 (Blah : Blah1) Service-name:: Content( May span multiple lines)
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
24 May 2017 17:00:06,831 [INFO] 567890 (Blah : Blah2) Service-name:: Content( May span multiple lines)
鉴于搜索键 123456,我想提取以下内容:
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
使用 grep 给我单行日志,但只给我一部分多行日志。
我尝试使用 awk 检查搜索模式后的几行,并检查是否到达另一个日志,但它变得效率低下。我需要某种可以与 pcregrep 或 perl 甚至 awk 一起使用的正则表达式来获取此输出。
请帮助我,因为我的正则表达式很糟糕。
怎么样:
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,所有内容都会打印到下一个日期。
我有一个日志文件,其中每个日志都遵循一种模式:
日期 [FLAG] LogRequestID:内容
每个日志的内容部分可能跨越多行。给定一个 LogRequestID,我需要搜索所有事件,并获取整个日志。我需要使用 perl、awk、sed 或 pcregrep 来完成此操作。
示例输入(注意日志之间没有空行):
24 May 2017 17:00:06,827 [INFO] 123456 (Blah : Blah1) Service-name:: Single line content
24 May 2017 17:00:06,828 [INFO] 567890 (Blah : Blah1) Service-name:: Content( May span multiple lines)
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
24 May 2017 17:00:06,831 [INFO] 567890 (Blah : Blah2) Service-name:: Content( May span multiple lines)
鉴于搜索键 123456,我想提取以下内容:
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
使用 grep 给我单行日志,但只给我一部分多行日志。
我尝试使用 awk 检查搜索模式后的几行,并检查是否到达另一个日志,但它变得效率低下。我需要某种可以与 pcregrep 或 perl 甚至 awk 一起使用的正则表达式来获取此输出。
请帮助我,因为我的正则表达式很糟糕。
怎么样:
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,所有内容都会打印到下一个日期。