2017-04-01 38 views
0
tail -f /var/log/kern.log | sed 's/.* //' 

給我的終端上的輸出,但是當我做不能輸出重定向到一個文件

tail -f /var/log/kern.log | sed 's/.* //' >> logfile.txt 

我無法找到該文件中任何事情。從內核模塊我打印可執行文件的名稱。例如,如果我運行ls,kern.log/bin/ls但有時間戳記等等所以即時通訊嘗試上述提取只有路徑和它的工作,只要我運行它沒有重定向到輸出文件,我也試過tee logfile.txt。依然沒有。請幫忙。

回答

0

您的sed命令的問題在於,您將「所有後面跟着空格的東西」(「。*」)替換爲「空白」。你需要做的是把所有東西都抓到第一個空間並保存,然後用保存的位替換所有的東西。要保存部分輸入字符串,請將該部分正則表達式放在括號內:(.*)然後可以使用\1將其置於替換字符串中。

但還有更多。 sed是貪婪的 - 它會盡可能地抓住它。所以當你得到一個像「abc def ghi」這樣的字符串時,它會看到「abc def」後面跟着一個空格並抓住所有這些。所以問題是,你如何得到第一部分,直到第一個空間?

您可以選擇不是您的分隔符(空格)後面跟空格的所有字符。所以在上面的例子中,因爲cd之間的字符是空格,所以不會被選中,只有部分會被選中。

所以你最終這是什麼:

sed "s/\([^ ]*\) .*/\1/"` 

其中,匹配模式由「任何東西,這不是一個空間,多則有」(即括號中保存它)"([^ ]\*)"的,單個空間" ",然後是其他任何東西".*"。替換字符串"\1"是「與第一組括號中的正則表達式部分匹配的任何內容」。

下面是一個簡單的測試,我做的事:

Testing: cat testout.txt 
cat: testout.txt: No such file or directory 

Testing: cat testin.txt 
abc def ghi 
asdf jkl; fdsa ;lkj qwerty 123 
Once upon a time 
When in the course 

Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt 

Testing: cat testout.txt 
abc 
asdf 
Once 
When 

Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt 

Testing: cat testout.txt 
abc 
asdf 
Once 
When 
abc 
asdf 
Once 
When 

Testing: 

它一無所有開始了在testout.txt和4線testin.txt。然後它將testin.txt的內容發送到sed,輸出附加到文件中。然後顯示內容。我再次做了它,然後,顯示它是真的追加(現在有12行,在testout.txt,兩套4.)(注意:我添加了空白行以方便閱讀。)

如果您有任何問題,請讓我知道。

希望這會有所幫助!

+0

非常welll解釋,謝謝! – GeorgeOfTAC

-1

對不起,但不是隻有一個「>」把文件內容?

+0

「>>」用於將**內容附加到文件 –

+0

令人驚歎!對不起:D – mprandot

+0

OP已經提到使用'>>'重定向到logfile.txt不起作用。重定向命令'>'也不起作用。只要尾巴它會覆蓋日誌。最好是使用追加'>>' – LethalProgrammer