Powershell - 从日志返回行号的有效方法

时间:2017-04-26 00:36:18

标签: powershell

我有一个非常大的日志文件(最大1GB),全天附加。在这个日志中有各种各样的字符串,我想搜索(我已经可以使用Select-String实现)但是我在每次扫描时都扫描整个文件,效率很低而且不必要。

理想情况下,我想在每次扫描时仅扫描日志的最后5分钟。不幸的是,日志文件的每一行都不包含时间戳。我最初想过在最后5分钟的时间戳上做一个通配符select-string,结合感兴趣的字符串会遗漏一些事件。我目前唯一的另一个想法是确定感兴趣的行号,$FromLineNumber(当前系统时间前5分钟)和$ToLineNumber(日志文件的最后一行号),然后仅Select-String 1}}在这两个行号范围之间。

例如,要在第50行和日志的最后一行之间进行搜索。我可以返回$FromLineNumber的行号,但我正在努力抓取$ToLineNumber作为最后一行日志。

Q值。如何仅返回日志文件最后一行的行号?

到目前为止,我已尝试使用Get-Content $path -tail -1(对象类型linenumber)返回此值,但即使使用各种开关和变体,它也始终返回空白值。我只能通过Select-String cmdlet返回行号,但是我没有要使用的与日志的最后一行相关的特定字符串。我是否按照其原始设计滥用此cmdlet,如果是这样的话......还有其他替代方法可以返回最后一个行号吗?

接下来......一旦我确定了要在其间搜索的行号范围,我会在之间使用Get-Content循环隔离这些行 $FromLineNumber$ToLineNumber首先过滤到这个较小的选择,然后将其传输到Select-String中,或者是否有更有效的方法来实现此目的?我怀疑循环数千行会对资源要求很高,所以我很想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

以下是第一个问题的答案

来自https://blogs.technet.microsoft.com/heyscriptingguy/2011/10/09/use-a-powershell-cmdlet-to-count-files-words-and-lines/

  

如果我想知道文件中包含多少行,我将Measure-> Object cmdlet与行开关一起使用。此命令如下所示:

Get-Content C:\fso\a.txt | Measure-Object –Line