如何使用 Powershell 从文件中过滤出多行文本组?

如何使用 Powershell 从文件中过滤出多行文本组?

我有一个错误日志,我想使用 Powershell 过滤掉所有已知错误。我知道如何在 powershell 中按行过滤,但我的问题是错误日志中的错误跨越多行,但它们总是以日期时间开头。例如:

2016-01-14 01:01:01 Error 1: blab blab blab
blab blab blab line 1
blab blab blab line 2
blab blab blab line 3
2016-01-14 02:33:04 Error 2: blab blab blab
blab blab blab line 1
blab blab blab line 2
2016-01-14 02:33:04 Error 3: blab blab blab
blab blab blab line 1

我想过滤掉错误 1 ​​和错误 3,因此输出将只有:

2016-01-14 02:33:04 Error 2: blab blab blab
blab blab blab line 1
blab blab blab line 2

是否有某种方法可以轻松地按日期时间分组并使用 powershell 进行过滤?

提前致谢!

答案1

您可以使用类似这样的方法。这可用于过滤多行中的特定错误,在此示例中为“错误 1”。之后,您可以再次运行并过滤掉“错误 3”。

$content = Get-Content -Path 'C:\Temp\test.log'

# Search all the errors
$errorLines = ($content | Select-String 'Error').LineNumber

foreach ($errorLine in $errorLines) {

    $someError = $content[$errorLine-1]

    # Known error to 'filter' out
    if ( $someError -like '*Error 1*') {

       # Search for line number of next error 
       [int]$errorLineNext = ($content[($errorLine)..$content.Count] | Select-String 'Error' | Select-Object -First 1).LineNumber

       # No next errors found? Then use the total line number
       if ( $errorLineNext -eq 0 ) { $errorLineNext = ($content.Count+1) - $errorLine }

       $content.RemoveRange($errorLine-1, $errorLineNext)  
    }
}

$content | Set-Content -Path 'C:\Temp\test.log'

相关内容