通过sed管道问题

Joe*_*oel 4 bash shell sed pipe

我在通过sed管道时遇到了麻烦.一旦我将输出管道输出到sed,我就无法在其他地方输出sed的输出.

wget -r -nv http://127.0.0.1:3000/test.html
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)

我通过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'
Run Code Online (Sandbox Code Playgroud)

输出:

http://127.0.0.1:3000/test.html
http://127.0.0.1:3000/robots.txt
http://127.0.0.1:3000/shop
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

有趣的是,以下产生没有输出(与上面相同,但通过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
Run Code Online (Sandbox Code Playgroud)

为什么我不能将sed的输出传输给像cat这样的另一个程序?

R S*_*hko 7

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

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