正则表达式多行日志

时间:2018-09-04 07:38:36

标签: .net regex powershell

我想使用.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

2 个答案:

答案 0 :(得分:1)

尝试以下任何一种方法

(?m)A status: Success(?:\n\h+.+)+Location: ABC

(?m)A status: Success(?:\n\s+.+)+Location: ABC(如果不支持\h

Demo1

Demo2

说明

仅限制您处理额外数据的方式。代替.*?,只需使用(?:\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).++

Demo