【问题标题】:Powershell: How to do a Select-String search with an -Exclude for multiple lines of text in another filePowershell:如何使用 -Exclude 对另一个文件中的多行文本进行 Select-String 搜索
【发布时间】:2015-01-30 20:15:03
【问题描述】:

项目:我有一个正在不断添加的日志文件。在此日志文件中,有时会添加一个错误(错误始终包括“无法导入”和唯一 ID)。当此错误添加到日志文件时,我需要通过电子邮件收到警报。

项目当前状态:我有脚本(计划每 15 分钟运行一次)使用 Select-String 扫描日志文件,如果发现此错误,则会添加它到一个名为 alert-(Get-Date).txt 的单独文本文件。在 PS 脚本结束时,alert.txt 文件会通过电子邮件发送给我。

问题:每天都会创建一个新的日志文件,因此我的脚本只扫描该文件。问题是一旦发现错误,每次后续扫描都会向我发送我已经知道的错误的警报。我希望后续警报仅包含新错误。

当前解决问题的尝试 以下是日志文件中的示例错误:

 1/29/2015 13:38:45 1/29/2015 13:38:45  Sales Order User Import     Unable to import OHDR_2785_228038_01292015.txt due to required files missing. Files are being removed from current directory to suspense directory.

我已在脚本中添加了提取日志文件中错误的唯一 ID 的方法。在本例中为 2785。此 ID 和其他错误 ID 被添加到另一个名为 oldAlerts.txt 的文本文件中。所以内容是这样的:

2785
1182
1353
1555

我想在我的脚本中添加一种方法来为 Select-String 结果排除这些行。到目前为止,这是我的 Select-String:

Get-ChildItem \txtforerp\Import\Log | Where{$_.LastWriteTime -gt (Get-Date)-$ts -AND $_.LastWriteTime -lt (Get-Date)} | select-string -Pattern "Unable to import" | Out-File $path\"$alert.txt" 

如何将 oldAlert.txt 文件中的 ID 用作过滤器,以确保只有新错误才会添加到警报中。 如果我的做法不是最佳做法,我愿意使用其他方法。

【问题讨论】:

    标签: powershell-3.0 select-string


    【解决方案1】:

    我建议使用negative assertion lookahead 排除已报告的任何行。此外,使用 Select-String 也应该很容易识别新 ID:

    Get-ChildItem \txtforerp\Import\Log | Where{ $_.LastWriteTime -gt (Get-Date)-$ts } | 
        Select-String "Unable to import OHDR_(?!$($ids -join '|'))(\d{4})" | 
        Select-Object Filename, Line, { $_.Matches.Groups[1].Value }
    

    在此代码中,$ids 表示先前标识的 ID 列表。 顺便说一句:我删除了这个检查:

    $_.LastWriteTime -lt (Get-Date)
    

    检查文件是否在将来没有被修改似乎不合理......?

    【讨论】:

    • 这行得通。感谢您的帮助,感谢您向我介绍正则表达式。直到现在我还没有听说过。我发现您在帖子中链接到的教程非常有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多