【问题标题】:Matching log entries across multiple lines in PowerShell在 PowerShell 中跨多行匹配日志条目
【发布时间】:2019-06-14 19:05:08
【问题描述】:

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

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

不知道为什么这不起作用。有没有其他方法可以让它工作?

【问题讨论】:

  • 我认为你需要修饰符,因为它跨行匹配。 $pattern = '(?m)BEGIN(.|\s)*?'+$id+'(.|\s)*?END'
  • 也可以这样做(?sm)BEGIN.*?123456.*?END
  • 根据您对数据的处理方式,您可以在开始时拆分文件并以这种方式分析“块”。只有当你做的比你在这里展示的更多。

标签: powershell


【解决方案1】:

我认为因为您想要一个必须包含换行符的正则表达式,所以可能使用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

【讨论】:

    【解决方案2】:

    我会使用lookbehind 将日志分成多个部分

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

    示例输出:

    BEGIN
    ...
    123456
    ...
    END
    

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多