在PowerShell中跨多行匹配日志条目

时间:2019-06-14 19:05:08

标签: powershell

我正在尝试搜索包含跨多行的日志条目的日志文件。示例:

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 :(得分:0)

我想是因为您想要一个必须包含换行符的正则表达式,也许可以将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

答案 1 :(得分:0)

我用lookbehind

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

示例输出:

BEGIN
...
123456
...
END