2010-03-11 80 views
4

我在通过sed管道时遇到问题。一旦我有管道输出到sed,我不能在其他地方输出sed。通过sed管道故障

wget -r -nv http://127.0.0.1:3000/test.html 

输出:

2010-03-12 04:41:48 URL:http://127.0.0.1:3000/test.html [99/99] -> "127.0.0.1:3000/test.html" [1] 
2010-03-12 04:41:48 URL:http://127.0.0.1:3000/robots.txt [83/83] -> "127.0.0.1:3000/robots.txt" [1] 
2010-03-12 04:41:48 URL:http://127.0.0.1:3000/shop [22818/22818] -> "127.0.0.1:3000/shop.29" [1] 

我管通过sed将得到URL的清洁列表输出:

wget -r -nv http://127.0.0.1:3000/test.html 2>&1 | grep --line-buffered -v ERROR | sed 's/^.*URL:\([^ ]*\).*/\1/g' 

输出:

http://127.0.0.1:3000/test.html 
http://127.0.0.1:3000/robots.txt 
http://127.0.0.1:3000/shop 

我想然后将输出转储到文件,所以我这样做:

wget -r -nv http://127.0.0.1:3000/test.html 2>&1 | grep --line-buffered -v ERROR | sed 's/^.*URL:\([^ ]*\).*/\1/g' > /tmp/DUMP_FILE 

我在几秒钟后中断了进程并检查了该文件,但它是空的。

有趣的是,下面的产率没有输出(与上面相同,但管道SED输出通过猫):

wget -r -nv http://127.0.0.1:3000/test.html 2>&1 | grep --line-buffered -v ERROR | sed 's/^.*URL:\([^ ]*\).*/\1/g' | cat 

为何无法管的sed将像猫另一个程序的输出?

+0

sed应该可以正常使用管道,例如:echo“foo”| sed's/foo/bar/g'>/tmp/foo对我来说工作得很好。向sed添加-u选项是否有所作为?或者尝试在检查文件之前让该过程完成。 sed可能只是做了太多的内部缓冲结果。 – bdk 2010-03-11 17:58:16

回答

6

当sed正在写入另一个进程或文件时,它会缓冲数据。

尝试将--unbuffered选项添加到sed。

+0

就是这样。谢谢! – Joel 2010-03-11 17:56:04

1

你也可以使用awk。由于您的网址显示在字段3中,因此您可以使用$ 3,并且您也可以删除该grep。

awk '!/ERROR/{sub("URL:","",$3);print $3}' file 
+0

谢谢。有一天我真的应该学习awk。 – Joel 2010-03-13 01:24:33

+0

为什么不从今天开始? :) – ghostdog74 2010-03-13 01:54:40