Соответствие записей журнала в нескольких строках в PowerShell - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь найти файл журнала, который содержит записи журнала, которые занимают несколько строк. Пример:

BEGIN
...
123456
...
END
BEGIN
...
456789
...
END

Я хочу найти определенное число (123456), но распечатать все, начиная с предыдущего тега BEGIN и заканчивая тегом END. Как я могу сделать это в PowerShell?

Я пробовал несколько регулярных выражений, но не получил его на работу. Код, который у меня пока есть:

$id = '123456'

$pattern = 'BEGIN(.|\s)*?'+$id+'(.|\s)*?END'

$matches = Select-String -Path "C:\temp\logile.log" -Pattern $pattern

Не уверен, почему это не работает. Есть ли другой способ заставить его работать?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Я бы разбил журнал на разделы с lookbehind

foreach ($Section in (Get-Content C:\temp\logile.log -raw) -split '(?<=END\r?\n?)' -ne ''){
    if($section -match '123456'){
        $Section
    }
}

Пример вывода:

BEGIN
...
123456
...
END
0 голосов
/ 14 июня 2019

Я думаю, потому что вы хотите, чтобы регулярное выражение включало символы новой строки, возможно, стоит использовать Get-Content с переключателем -raw. Я включил, что должна быть новая строка до и после текста поиска, чтобы избежать частичных совпадений.

$id = '123456'
$pattern = '(?<=BEGIN)(.|[\n\r])+?\r\n' + $id + '\r\n(.|[\n\r])+?(?=END)'
[regex]::Match((Get-Content "C:\temp\logile.log" -Raw), $pattern).value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...