2017-04-01 53 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