【问题标题】:Powershell: Display last X lines of a log that match a criteria and keep watching the filePowershell:显示符合条件的日志的最后 X 行并继续监视文件
【发布时间】:2016-04-19 17:17:38
【问题描述】:

我正在尝试查看日志文件中出现的单词(“Purge”)。 我想显示最后 10 个 匹配 行(在命令运行时)并继续观察文件中是否有符合条件的新附加行。

到目前为止,我得到了一些使用 PowerShell 的东西:

get-content .\CallAudit.Engine.log -tail 10 -Wait | where {$_ -match "Purge"}

这可行,但它会获取最后(任何)10 行,然后才应用过滤器。

我想要

  • 只获取匹配最后10行
  • 让命令继续监视文件。

这个可以吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    -Tail 10 对您没有帮助,因为您的purge-filter 在读取最后 10 行(可能包含也可能不包含 purge)后执行。

    我会把它分成两个电话。一个用于列出最后 10 个值,一个用于监控。

    Get-Content -Path .\CallAudit.Engine.log | Where-Object {$_ -match "Purge"} | Select-Object -Last 10
    Get-Content -Path .\CallAudit.Engine.log -Wait -Tail 0 | Where-Object {$_ -match "Purge"}
    

    【讨论】:

    • 不错,看起来很“常识”。有没有办法连接两个结果列表,使其成为“单线”?
    • 为什么?我们的想法是首先将它们拆分,以避免过于复杂的where/foreach-loops 来实现简单的事情。可读性应该始终是优先事项。 :-) 如果您真的需要它,请在第一行之后添加 ; 以结束当前命令/行并加入这些行。例如..get-content .. | where .. | Select -last 10; get-content -wait | where....
    • 为什么?因为我对语法很好奇:)
    • 这就是我添加解决方案的原因(加入 ; 行)。但是,它的运行方式与使用换行符的方式相同。 :-)
    【解决方案2】:

    只需为工作使用正确的工具less.exe。它最常被用作寻呼机(相当于 Windows 上的 more),但它是一个很棒的工具,可用于快速检查文件并监控它们。

    对于您的情况,您需要使用以下较少的选项:

    • &/ - 过滤行(同where-object .... match
    • F - 永远转发(与gc .. -Wait -Tail 相同)

    如果您的文件是log.txt,并且您只需要监控数字,那么这是命令:

    less.exe +"&[0-9]+`nF"  log.txt
    

    这是输出的样子:

    更改[0-9]+ 以匹配您的模式并保留其他所有内容。另一个例子,只实时显示构建错误并隐藏其他所有内容

    less.exe +"&^ERROR`nF" build.log
    

    你可以从巧克力中得到更少的东西:cinst less

    在这里使用 less 而不是纯 powershell 的好处是:

    • 跨平台
    • less 非常强大,被许多 Windows 工具所使用,例如 git、powershell 社区扩展等。在您的武器库中拥有这样的工具非常好。

    【讨论】:

    • +1 获取信息,对开发箱非常有用。我的场景涉及 RDP 进入可能的生产机器,可能是客户的机器,因此安装 3rd 方工具(巧克力 + 包)可能是不需要的或完全不可能的。这就是为什么我更喜欢 PS——或任何其他使用“内置”工具的解决方案
    • 您可以将less.exe复制到生产环境或直接从共享中使用。它是一个文件 ~100KB。
    猜你喜欢
    • 2018-03-28
    • 2012-11-17
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多