7

我的脚本每分钟读取一次日志文件并选择(并根据)时间戳从前一分钟开始的行。

这很容易(正则表达式只是“^$timestamp”),但是当日志变大时可能需要一段时间。

我的想法是我想要的行总是在文件的底部附近,所以如果我从底部开始向上搜索,我会搜索更少的行,当我到达前一分钟时停止有兴趣。

我的问题是,如何从文件底部而不是顶部进行搜索?我什至可以说“读取行 $length”,甚至可以说“读取行 n”(如果可以的话,我可以做一种二进制搜索来查找文件的长度并从那里向后工作)?

最后一个问题:这会更快吗(即使它不会更快,我仍然想知道怎么做)?

理想情况下,我想在我自己的代码中完成这一切,而不需要安装任何额外的东西。

谢谢

4

3 回答 3

14

获取内容 bigfile.txt -tail 10

这句话几乎立即出现在巨大的文件上,没有任何大的内存使用。

我在测试中使用了一个 22 GB 的文本文件。

执行诸如“get-context bigfile.txt | select -Last 10”之类的操作,但似乎必须加载所有行(或 powershell 中的对象)然后进行选择。

于 2015-01-28T19:40:11.130 回答
5

我可以建议将正则表达式更改为等于 Get-Date + 您想要的任何时间段吗?

例如(这没有你的日志,所以我很抱歉)

$a = Get-Date
$hr =  $a.Hour
$min =  $a.Minute

然后处理这些值以构建正则表达式以选择您想要的时间。如果您还没有使用它,这个网站非常适合快速轻松地构建正则表达式http://gskinner.com/RegExr/

有另一个修复,我想你会喜欢这个..

$a = get-content .\biglog.text

使用长度从后到前对数组进行切片,将写入主机更改为选择字符串和您的正则表达式或您想要反向执行的任何操作..

foreach($x in $a.length..0){ write-host $a[$x] }

再次获取内容 cmdlet 之后的另一个选项,此选项只是反转数组的顺序,然后您从下到上读取 $a

[array]::Reverse($a)

直流

于 2012-04-23T17:05:50.330 回答
2

If you only want the last bit of the file, depending on the format, you can just do this:


Get-Content C:\Windows\WindowsUpdate.log | Select -last 10

This will return the last 10 lines found in the file.

于 2012-04-24T13:27:10.990 回答