2012-04-23 55 views
2

我的脚本每分钟读取一次日志文件,并选择(并作用于)时间戳以前一分钟开始的行。Powershell:从文件末尾向后搜索

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

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

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

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

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

感谢

回答

5

可能我建议只是改变正则表达式等于获取最新+任意时间你想要什么?

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

$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之后的另一种选择再次,这个选项只是扭转订单数组,那么你是从底部读$一个顶部

[array]::Reverse($a) 

DC

+0

是的,这几乎就是我所做的:)(用-1得到最后一分钟),这只是我在考虑必须读取所有日志,直到它达到前一分钟(OK,所以它只需要每行最多读取八个字符,但仍然是),这将永远在底部,所以不会更容易从底线反向读取,因此读取的线条少得多。 – mazz0 2012-04-24 09:09:42

+0

检查我的旧回答大大改善。 – dc5553 2012-04-24 13:14:23

+0

我回答了您的问题吗? – dc5553 2012-04-25 07:38:55

2

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


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

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

+0

不错,这3种不同的方式来获得最后的日志或工作回到前面。 – dc5553 2012-04-24 13:41:55

+0

我看到这会有什么帮助,但是我有和@ dc5553一样的问题:调用Get-Content会将整个文件读入内存吗?这将在生产服务器上运行,所以我无法使用所有内存。 – mazz0 2012-04-30 16:46:10

+0

将Get-Content放入一个变量中会将它读入内存,但是按照我所做的过滤Get-Content命令只会保存内存中最后10行的文件。至少据我所知...... – 2012-04-30 17:16:21

6

获取内容bigfile.txt -tail 10

上大文件这句话几乎是立刻就没有什么大的内存使用情况。

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

做一些类似“get-context bigfile。txt |选择-Last 10“的作品,但它似乎必须加载所有行(或PowerShell中的对象)然后做选择。

+1

你需要使用PowerShell 3或更高版本,但如果你这样做,这是最好的答案。 – 2015-07-04 07:57:48