我有一个非常大的日志文件(最大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中,或者是否有更有效的方法来实现此目的?我怀疑循环数千行会对资源要求很高,所以我很想知道是否有更好的方法。
答案 0 :(得分:1)
以下是第一个问题的答案
如果我想知道文件中包含多少行,我将Measure-> Object cmdlet与行开关一起使用。此命令如下所示:
Get-Content C:\fso\a.txt | Measure-Object –Line