Powershell:从文件末尾向后搜索

maz*_*zz0 6 powershell scripting

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

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

我的想法是我想要的线总是靠近文件的底部,所以如果我从底部开始向上搜索,我会搜索更少的线,当我到达我之前的那一刻时停止有兴趣.

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

最后一个问题:这会更快(我还是想知道如何做到这一点,即使它不会更快)?

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

谢谢

小智 10

get-content bigfile.txt -tail 10

这些文字几乎可以在没有大量内存使用的情况下立即存储

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

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

  • 您需要使用 PowerShell 3 或更高版本,但如果您这样做,这是最好的答案。 (2认同)

dc5*_*553 5

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

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

$a = Get-Date
$hr =  $a.Hour
$min =  $a.Minute
Run Code Online (Sandbox Code Playgroud)

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

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

$a = get-content .\biglog.text
Run Code Online (Sandbox Code Playgroud)

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

foreach($x in $a.length..0){ write-host $a[$x] }
Run Code Online (Sandbox Code Playgroud)

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

[array]::Reverse($a)
Run Code Online (Sandbox Code Playgroud)

DC