2012-04-23 94 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