重定向 pv 的输出以进行进一步处理

问题描述 投票:0回答:3

我正在尝试重定向 pv 命令的 stderr 并使用 tr 处理它,如下所示:

(dd if=/dev/zero | pv -f -r > /dev/null) 2>&1 | tr "\r" "\n"

(dd 只是一个例子)并且这段代码非常好(输出就像

[ 189MB/s] 
[ 188MB/s] 
[ 186MB/s] 
[ 180MB/s]

)但问题是放置“|”或“>”重定向它不会导致任何内容流到目标文件或管道。我想进一步处理这个输出,但我不知道为什么会这样以及如何解决这个问题。有谁有线索吗?

bash redirect
3个回答
0
投票

您正在将

stdout
设为
/dev/null
,然后尝试将其通过管道传输到
tr
。此时输出已经丢失。去掉
> /dev/null
部分


0
投票

怎么样:

dd if=/dev/zero | pv -f -r 2> >(tr "\r" "\n") >/dev/null 

编辑:

由于 OP 想要处理 tr(pv 的 stderr)的输出,这可以帮助:

dd if=/dev/zero | pv -f -r 2>&1 >/dev/null | tr "\r" "\n" | your_process_command

它将 stderr 重定向到 stdout,并将 stdout 重定向到 /dev/null。因此,带宽数据位于标准输出上,然后馈送到 tr。

编辑2:
抱歉,编辑也不起作用。我会尝试找到更好的方法并更新它....


0
投票
dd if=/dev/zero | pv -f -r 2>&1 >/dev/null | tr "\r" "\n"

输出:

[ 270MiB/s]
[ 276MiB/s]
[ 268MiB/s]

重定向的顺序很重要。

您需要将

2>&1
放在
>/dev/null
之前。我发现这个关于它如何工作的解释很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.