2012-10-11 26 views
2

我運行了一個minecraft服務器並且想定期清理我的日誌文件。我已經開發了一堆能夠在gedit或notepad ++中使用的正則表達式命令,並且它們完美地工作,但我希望能夠自動化該過程。SED正則表達式替換日誌文件

基本文件清理的命令是這樣的:

cat server.log | sed -e 's/REGEXTODELETE//g' > server.log 

,但我遇到了麻煩正則表達式命令正確轉換到SED。我在CentOS6.3上使用sed。

下面是在記事本++工作的命令的例子:

^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ \[INFO\] Connection reset$ 

但是當我進入到我的bash腳本:

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$//g' > server.clean.log 

它清空整個文件。我看了全部,我懷疑我有空白的問題,但經過大約一個小時的搜索後,我卡住了。任何幫助表示讚賞,我可以提供更多示例。

+1

'cat file | anycmd> file'將截斷該文件。在貓看到內容之前,shell用'>'截斷文件。 –

回答

0

問題是您在輸入文件被讀取前覆蓋輸入文件。

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$//g' > server.clean.log 

應該像

cat server.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$//g' > server.clean.log 

一般來說,

program <infile >infile 
因爲 infile

將無法​​正常工作(可靠)將被截斷program都有機會讀它

+0

責怪我的貓踩着我的桌子。我已經刪除了downvote。但具有諷刺意味的是,你仍然建議不必要地使用'cat'。 – ghoti

+0

噢,不錯。我以爲我錯過了什麼。回覆。 UUoCat:我不是。我只是沒有進入任何路徑:) – sehe

+1

簡單地說,' Steve

1

如果你想在沒有創建的情況下在線修改文件你可以使用sed的-i選項。例如,如果你想刪除具有你所提到的字符串的所有行,你可以使用:

sed -i'' '/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$/d' server.log 

這避免了不必要的管道,以及你與輸出重定向到您的輸入體驗的困惑文件。

請注意,我在這裏使用sed來刪除行。當您使用s/RE/text/表示法時,您將替換內容IN-LINE。你的總輸出行數將與輸入相同,只有(我收集),如果你只是將文本替換爲空白,你將會有一堆空白行。

如果您不介意處理臨時文件問題,則可以使用grep而不是sed來讓這個更清楚。

grep -v '^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$' server.log > clean..log 

或者甚至是:

grep -Pv '^\d+(-\d+)+ \d+(:\d+)+ \[INFO\] Connection reset$' server.log > clean.log 

,如果你正在使用Linux和不介意evil regular expressions。 (根據我的經驗,\d POSIX級別的短手除非將正則表達式視爲PCRE,否則不能可靠地工作。