我在通过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这样的另一个程序?
答案 0 :(得分:7)
当sed写入另一个进程或文件时,它将缓冲数据。
尝试将--unbuffered
选项添加到sed。
答案 1 :(得分:1)
你也可以使用awk。由于您的URL出现在字段3中,您可以使用$ 3,也可以删除grep。
awk '!/ERROR/{sub("URL:","",$3);print $3}' file