我的脚本每分钟读取一次日志文件,并选择(并作用于)时间戳开始于前一分钟的行。
这很简单(正则表达式只是“^ $ timestamp”),但是当日志变大时,可能需要一段时间。
我的想法是我想要的线条总是靠近文件的底部,所以如果我从底部开始向上搜索,我会搜索更少的线条,当我到达前一分钟时停止我很感兴趣。
我的问题是,如何从文件底部而不是顶部进行搜索?我甚至可以说“读取行$ length”,甚至“读取行n”(如果是这样的话,我可以做一些二进制搜索,找到文件的长度并从那里向后工作)?
最后一个问题:这会更快(我还是想知道怎么做才算不快)?
理想情况下,我想在我自己的代码中完成所有操作,而无需安装额外的任何内容。
由于
答案 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行。