无法将输出重定向到文件

时间:2017-04-01 12:10:19

标签: linux shell scripting ubuntu-14.04

int [] arr = {2,4,1,6,5,9,0,7};
Arrays.sort(arr);
System.out.println(arr[arr.length - 2]);

给我终端输出但是当我做

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

我无法在文件中找到任何内容。从内核模块中,我打印可执行文件的名称。例如,如果我运行 tail -f /var/log/kern.log | sed 's/.* //' >> logfile.txt lskern.log但有时间戳等等。所以我尝试上面只提取路径,只要我运行它而不重定向到输出文件,我也试过/bin/ls。依然没有。请帮忙。

2 个答案:

答案 0 :(得分:0)

你的sed命令的问题在于你正在使用“空格后面的所有内容”(“。*”)并将其替换为“nothing”。您需要做的是将所有内容抓到第一个空间并保存,然后用保存的位替换所有内容。要保存部分输入字符串,请将正则表达式的那部分放在括号中:(.*)然后可以使用\1将其放入替换字符串中。

但还有更多。 sed是贪婪的 - 它会尽可能多地抓住它。所以,当你有一个像“abc def ghi”这样的字符串时,它会看到“abc def”后跟一个空格并抓住所有这些。所以问题是,你如何得到第一部分,直到第一个空间?

您可以选择所有不是分隔符(空格)的字符,后面跟一个空格。因此,在上面的示例中,因为 c d 之间的字符是空格,所以不会选择该字符,只有 abc 部分才会是。

所以你最终得到的是:

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 开始, testin.txt 中的4行开头。然后它将 testin.txt 的内容发送到sed,输出附加到文件。然后它显示内容。然后,我再次这样做,以显示它真的是附加的(现在在 testout.txt 中有8行,两组是4.)(注意:我添加了空行只是为了让它更容易读出。)

如果您有任何疑问,请与我们联系。

希望这有帮助!

答案 1 :(得分:-1)

抱歉,但并非只有一个">"将内容放入文件?