Powershell:从文件末尾向后搜索

时间:2012-04-23 16:50:33

标签: powershell scripting

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

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

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

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

最后一个问题:这会更快(我还是想知道怎么做才算不快)?

理想情况下,我想在我自己的代码中完成所有操作,而无需安装额外的任何内容。

由于

3 个答案:

答案 0 :(得分:10)

get-content bigfile.txt -tail 10

这些文字几乎可以立即显示在大文件上而没有任何大量内存使用。

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

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

答案 1 :(得分:5)

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

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

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

然后解决这些值以构建正则表达式以选择所需的时间。如果您还没有使用它,那么这个网站很快就可以快速轻松地构建正则表达式http://gskinner.com/RegExr/

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

$a = get-content .\biglog.text

使用长度从后到前切割数组将更改写入主机更改为select-string和你的正则表达式或者反向做的任何事情。

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

再次使用get-content cmdlet后的另一个选项,此选项只是对数组进行反向排序,然后从底部到顶部读取$ a

[array]::Reverse($a)

直流

答案 2 :(得分:2)

如果您只想要文件的最后一位,具体取决于格式,您可以这样做:


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

这将返回文件中找到的最后10行。