.net 正则表达式多行日志
我想使用.NET/Powershell正则表达式在日志中搜索特定位置的.net 正则表达式多行日志,.net,regex,powershell,.net,Regex,Powershell,我想使用.NET/Powershell正则表达式在日志中搜索特定位置的Success状态,例如ABC 如果我使用以下模式:”(?ms)A status:Success.*Location:“with global(又称AllMatches),那么它会在任何位置查找状态为Success的所有日志记录 如果我试图通过在模式中添加ABC来缩小范围,那么匹配太贪婪了,从第18行的成功一直到第28行的ABC 我放弃了,使用了一种更明确的模式(它获取完整的日志记录,并且似乎有效,因为我指定了成功和位置之间的
Success
状态,例如ABC
如果我使用以下模式:”(?ms)A status:Success.*Location:“
with global(又称AllMatches),那么它会在任何位置查找状态为Success
的所有日志记录
如果我试图通过在模式中添加ABC
来缩小范围,那么匹配太贪婪了,从第18行的成功一直到第28行的ABC
我放弃了,使用了一种更明确的模式(它获取完整的日志记录,并且似乎有效,因为我指定了成功和位置之间的模式):
(?sm)^\d([\S]*\S{10}){3}状态:Success\S{2}([\S]*\S{10}){2}位置:ABC[\S]*
有没有更简单的模式可以找到我想要的
注意:我不介意模式是否获取从日期时间(包括)到日期时间(不包括)的完整日志记录
日志文件:
04/09/2018 06:31:59 AM [class | Info] some message received from 101592 (123.123.123.124)
Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
A type: bar
A status: Queued
The id: 1E25
Additional info: Inserted in queue at position 1 on device ABC
Location: ABC, subarea: 2
04/09/2018 06:31:59 AM [class | Info] some message received from 102364 (123.123.123.123)
Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
A type: bar
A status: Queued
The id: 1E25
Additional info: Inserted in queue at position 1 on device ABC
Location: ABC, subarea: 2
04/09/2018 06:31:59 AM [class | Info] some message received from 102364 (123.123.123.123)
Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
A type: blah bit foo
A status: Success
The id: T908
Additional info:
Location: DEF, subarea: 3
04/09/2018 06:32:00 AM [class | Info] some message received from 102364 (123.123.123.123)
Request Id: 0 (Descriptor: 0, Operator Request Id: 0)
A type: bar
A status: Success
The id: DG08
Additional info:
Location: ABC, subarea: 1
尝试以下任何一种方法:
(?m)A状态:成功(?:\n\h++)+位置:ABC
(?m)状态:成功(?:\n\s++)+位置:ABC
(如果不支持\h
)
解释:
只需限制处理额外数据的方式。不要使用*?
,只需使用(?:\n\h+[^\n]+)+
(即新行+开头的一些空格)即可,因为日期从行的开头开始,因此不允许查看下一个日志条目
(注意:我删除了s
修饰符)尝试以下任何一种:
(?m)A状态:成功(?:\n\h++)+位置:ABC
(?m)状态:成功(?:\n\s++)+位置:ABC
(如果不支持\h
)
解释:
只需限制处理额外数据的方式。不要使用*?
,只需使用(?:\n\h+[^\n]+)+
(即新行+开头的一些空格)即可,因为日期从行的开头开始,因此不允许查看下一个日志条目
(注意:我删除了
s
修饰符)尝试以下模式:^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC)。++
如果在行首有两个数字后跟/
:^\d{2}\/
,则开始匹配
然后,我匹配三行,进入状态
行:(.++\n){3}
,我使用所有格量词来避免回溯
然后,如果在当前行上出现成功
,我将匹配接下来的三行(我使用正向前瞻检查):(?=.Success)(.+\n){3}
然后我匹配最后一行,如果该行中有ABC
:(?=.+ABC)。++
尝试以下模式:
^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC)。++
如果在行首有两个数字后跟/
:^\d{2}\/
,则开始匹配
然后,我匹配三行,进入状态
行:(.++\n){3}
,我使用所有格量词来避免回溯
然后,如果在当前行上出现成功
,我将匹配接下来的三行(我使用正向前瞻检查):(?=.Success)(.+\n){3}
然后我匹配最后一行,如果该行中有ABC
:(?=.+ABC)。++
这里的方法相当麻烦。使用
Get Content-Raw
读取文件,在(?m)^(?=\d{2}/\d{2}/\d{4})处分成块
并反复使用Where Object
或Select String
来筛选所需的块。这里的方法相当麻烦。使用获取内容-Raw
读取文件,在处分为块(?m)^(?=\d{2}/\d{2}/\d{4})
并反复使用Where Object
或Select String
来筛选所需的块。只有当所需的日志条目是最后一个条目时,正则表达式才有效。@SebastianProske完全正确。现在应该修好了。谢谢我认为.NET不支持\h(水平空白)转义字符,但在其他方面也可以。它可以通过\s
更改,我刚才使用\h
是为了更安全。我将修改答案。您的正则表达式仅在所需的日志条目是最后一个条目时有效。@SebastianProske完全正确。现在应该修好了。谢谢我认为.NET不支持\h(水平空白)转义字符,但在其他方面也可以。它可以通过\s
更改,我刚才使用\h
是为了更安全。我将修改答案。