【问题标题】:Find latest matching entry from log file从日志文件中查找最新的匹配条目
【发布时间】:2015-07-13 09:32:58
【问题描述】:

我有一个日志文件,该文件全天不断被写入。 我需要一种方法来检查日志文件,并找到与特定字符串匹配的最后一个条目。

这个条目可以是从末尾算起的 5 行或 5000 行。

我不愿意阅读整个日志(到一天结束时可能超过 60000 行)。

我也不想取出所有匹配的条目然后获取最后一个,因为当事情运行时,匹配的条目可能占日志的三分之一。

到目前为止,我能找到的一切要么是使用 Select-String 将所有匹配项放入一个数组中,然后获取最后一个,要么使用 (Get-Content xxx) [-1..-x] 获取最后 x 行。两者都不能真正满足我的需要。

到目前为止我最接近的是:

$fullResult = (Get-Content $location)[-1 .. -5000] | 
                    Select-String -Pattern $srch -List |
                    Select-Object -First 1

但这并不完美,因为它只读取最后 5000 行,如果我追求的结果在第 5001 行,它将失败。

【问题讨论】:

    标签: powershell-2.0 select-string


    【解决方案1】:

    简单地使用Where-Object 过滤器有什么问题吗?

    Get-Content $location |
      Where-Object { $_ -match $srch } |
      Select-Object -Last 1
    

    【讨论】:

    • 干杯,原则上它可以工作,但它似乎仍然是从上到下读取的,因为当我针对一整天的日志文件运行它时,如果它需要的结果是在最后。
    • @IGGt 如果你不能定义在哪里停止,你就不能跳过。
    • 我想这很公平。我只是想也许有一种方法可以在最后开始阅读,就像我想象的那样,对于大多数人来说,最重要的信息通常在日志文件的末尾,而不是开头。
    • @IGGt 计算机在底层不是这样工作的(因为传统存储介质的工作方式)。要向后读取文件,他们必须将整个文件读入一个数组并以相反的顺序遍历该文件,或者多次读取文件,以减少每次迭代跳过的字节数。
    猜你喜欢
    • 2015-06-19
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多