我想使用.NET / Powershell正则表达式在特定位置(例如Success
)的日志中搜索ABC
状态。
如果我使用以下模式:具有全局(也称为AllMatches)的"(?ms)A status: Success.*?Location: "
,则它将在任何位置找到状态为Success
的所有日志记录。
如果我尝试通过在模式上附加ABC
来缩小范围,那么匹配就太贪心了,从第18行的Success一直到第28行的ABC
。 / p>
我放弃使用了更明确的模式(它获取了完整的日志记录,并且似乎可以正常工作,因为我在“成功”和“位置”之间指定了一种模式):
(?sm)^\d([ \S]*\s{10}){3}A status: Success\s{2}([ \S]*\s{10}){2}Location: 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
答案 0 :(得分:1)
尝试以下任何一种方法
: (?m)A status: Success(?:\n\h+.+)+Location: ABC
(?m)A status: Success(?:\n\s+.+)+Location: ABC
(如果不支持\h
)
说明:
仅限制您处理额外数据的方式。代替.*?
,只需使用(?:\n\h+[^\n]+)+
(这是新行+开头的空格),因为日期从行的开头开始,所以将不允许浏览下一个日志条目。 / p>
(注意:我删除了s
修饰符)
答案 1 :(得分:1)
尝试以下模式:^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC).++
。
我开始比赛,如果在行的开头有两位数字,后跟/
:^\d{2}\/
。
然后,我匹配三行,以进入status
行:(.++\n){3}
,我使用所有格量词来避免回溯。
然后如果在当前行上出现Success
(我以肯定的前瞻性进行检查),则匹配接下来的三行:(?=.+Success)(.++\n){3}
。
然后我匹配最后一行,如果该行中有ABC
:(?=.+ABC).++
。