2017-04-26 34 views
1

返回行号我有全天附加到一个非常大的日志文件(最大1GB)。在这个日志中有很多我想要搜索的字符串(我已经可以使用Select-String了),但是我在每次扫描时扫描整个文件,效率低下,而且不必要。PowerShell的 - 有效途径从日志

理想我想只扫描最后5分钟的日志在每次扫描这些字符串。不幸的是,并不是日志文件的每一行都包含一个时间戳。我最初想到在最后5分钟的时间戳中使用通配符select-string,结合感兴趣的字符串将错过一些事件。此刻我唯一的其他想法是确定感兴趣的行号,$FromLineNumber(当前系统时间前5分钟)和$ToLineNumber(日志文件的最后一行数字),然后只Select-String两者之间的行号范围。

作为一个例子,到线50和日志的最后线之间进行搜索。我能够返回$FromLineNumber的行号,但我正在努力抓取$ToLineNumber作为最后一行日志。

问:如何只返回一个日志文件的最后一行的行号?

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

继续...一旦我决定了行号范围之间的搜索我会隔离
$FromLineNumber$ToLineNumber第一间使用获取内容环路这些行向下筛选到这个较小的选择,然后管这种成选择字符串还是有更高效的方法来实现这一点?我怀疑成千上万条线路的循环​​需要资源,所以我很想知道是否有更好的方法。

+1

“可惜不是日志文件的每一行包含时间戳”你能告诉我们这个不寻常的日志文件的样本?要获得最后一行代码,您可能会使用Get-Content。\ file.log | Select-Object -Last 1 -ExpandProperty ReadCount'获得成功,但仍需要确定从哪一行开始 –

+1

不确定是否你故意拖尾“减1”;你应该是'Get-Content $ path -Tail 1'(正1)来获得最后一行。这应该是快速的,所以如果你能猜测你的5分钟将在最后100行或1000行内,并且被大量线条超调,那么这可能比其他方法更容易和更快。否则,请使用文件阅读器并退出文件末尾,反向处理行,直到您在5分钟前找到日期时间,然后停止。你不断提及行号; Select-String显示它们,但Get-Content不能使用它们 – TessellatingHeckler

+0

Get-Eventlog有一个-after参数,它应该能够实现。如果日志文件具有事件日志文件的格式,则可以并且应该使用此cmdlet。如果它有其他形式,为什么呢? –

回答