通过 sed 进行管道传输时出现问题

发布于 2024-08-24 23:35:05 字数 1269 浏览 7 评论 0原文

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

I am having trouble piping through sed. Once I have piped output to sed, I cannot pipe the output of sed elsewhere.

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

Outputs:

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]

I pipe the output through sed to get a clean list of URLs:

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

Outputs:

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

I would like to then dump the output to file, so I do this:

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

I interrupt the process after a few seconds and check the file, yet it is empty.

Interesting, the following yields no output (same as above, but piping sed output through cat):

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

Why can I not pipe the output of sed to another program like cat?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

顾冷 2024-08-31 23:35:05

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

尝试向 sed 添加 --unbuffered 选项。

When sed is writing to another process or to a file, it will buffer data.

Try adding the --unbuffered options to sed.

也只是曾经 2024-08-31 23:35:05

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

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

you can also use awk. since your URL appears in field 3, you can use $3, and you can remove the grep as well.

awk '!/ERROR/{sub("URL:","",$3);print $3}' file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文