2013-03-17 28 views
0

目前我有一個系統日誌(Growl.app在這種情況下),我希望不時看到。 我使用grep來過濾掉我不希望看到的行。替代緩慢的grep

cat /Users/Daniel/Library/Logs/Growl.log | grep -vE 'registered|Display frame|Reserving|Used rects|Beginning a pass|Successfully reserved|Adjusted display frame|---|User went idle|User returned|positionDisplay|primaryDirection|Bowtie:|secondaryDirection' | tail -20 > /Users/Daniel/Library/Logs/Growl-log.txt 
sleep 2 
qlmanage -p /Users/Daniel/Library/Logs/Growl-log.txt 

我不知道是否有更好的方式來篩選出信息,但因爲這是我的腳本需要相當長的時間來處理該命令。我不妨加入我的硬件,絕對不會讓它退縮。另外需要注意的是,'qlmanage'部分是一個OS X專用命令,它在「快速查看」窗口中顯示文本文件的內容。顯示請求時是即時的。

任何想法?

+1

這不會幫助你做'cat filename | grep'模式'。直接給grep文件名:'grep'模式'文件名'。 – 2013-03-17 03:12:34

回答

2

您正在要求系統讀取一個非常大的,可能連續增長的文件,並根據大量搜索(每個替換項:| z | c | V ..等等)刪除大量記錄。每當你要求它運行時,它都必須通過更多的記錄。

日誌是否有時間戳?結合一個時間戳(甚至更好,尾巴),grep,並且你可以每天或每個小時爲你運行一個作業,這個作業只需要一個小得多的文件即可。

基本上,你幾乎無法讀取MB的100個數字。讓我們從tail開始,它通過定位文件指針而不是讀取整個文件來工作。更快。

tail -20000 /Users/Daniel/Library/Logs/Growl.log | 
grep -vE 'registered|Display frame|Reserving|Used rects|Beginning a pass|Successfully reserved|Adjusted display frame|---|User went idle|User returned|positionDisplay|primaryDirection|Bowtie:|secondaryDirection' | 
> /Users/Daniel/Library/Logs/Growl-log.txt 
qlmanage -p /Users/Daniel/Library/Logs/Growl-log.txt 

調整20000以獲得合理的nunber樣本,通過您的過濾器。換句話說,prefilter該文件通過刪除早期的記錄,無論如何您都會選擇。

另一個加速是做一個積極的搜索 - grep你想要什麼,而不是你不想要的。

恭喜。您還獲得了UUOC獎。嘗試谷歌先生的術語UUOC(與貓有關)。每個人都在得知之前就獲得了這個獎項

+0

謝謝你指引我朝着正確的方向發展。我真的不知道原始日誌文件有多大(在做這個問題之前,我真的應該調查它)。 現在我只需要將日誌截斷爲最近的一些東西。一項應該相當容易自動化的任務。 – user1345658 2013-03-17 01:20:45