通过sed管道问题

时间:2010-03-11 17:48:57

标签: bash shell sed pipe

我在通过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

几秒钟后我中断了这个过程并检查了文件,但它是空的。

有趣的是,以下产生没有输出(与上面相同,但通过cat输出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的输出传递给像cat这样的另一个程序?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

你也可以使用awk。由于您的URL出现在字段3中,您可以使用$ 3,也可以删除grep。

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