Regex multiline log - PullRequest
       1

Regex multiline log

0 голосов
/ 04 сентября 2018

Я бы хотел использовать регулярное выражение .NET / Powershell для поиска в журнале статуса Success в определенном месте, скажем ABC.

Если я использую следующий шаблон: "(?ms)A status: Success.*?Location: " с глобальным (он же AllMatches), то он находит все записи журнала со статусом Success в любом месте.

Если я попытаюсь сузить его, добавив ABC к шаблону, то совпадение будет слишком жадным и переходит от Успеха в строке 18 до ABC в строке 28.

Я отказался и использовал шаблон, который является более явным (он захватывает полную запись журнала и, кажется, работает, потому что я задаю шаблон между успехом и расположением):

(?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 голосов
/ 04 сентября 2018

Попробуйте этот шаблон: ^\d{2}\/(.++\n){3}(?=.+Success)(.++\n){3}(?=.+ABC).++.

Я начинаю матч, если в начале строки есть две цифры, за которыми следует /: ^\d{2}\/.

Затем я сопоставляю три строки, чтобы перейти в строку status: (.++\n){3}, я использовал собственнический квантификатор, чтобы избежать возврата назад.

Затем я сопоставляю следующие три строки, если на текущей строке встречается Success (я проверяю это с положительным прогнозом): (?=.+Success)(.++\n){3}.

Тогда я сопоставляю последнюю строку, если в этой строке есть ABC: (?=.+ABC).++.

Демо

0 голосов
/ 04 сентября 2018

Попробуйте с любым из них:

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

(?m)A status: Success(?:\n\s+.+)+Location: ABC (если \h не поддерживается)

Demo1

Demo2

Разъяснения

Просто ограничьте способ обработки дополнительных данных. Вместо .*?, просто используйте (?:\n\h+[^\n]+)+ (это новая строка + несколько пробелов в начале). Это не позволит проходить следующую запись в журнале, поскольку дата начинается в начале строки.

(ПРИМЕЧАНИЕ: я удалил модификатор s)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...