如何处理dd的实时进度?

如何处理dd的实时进度?

我正在尝试处理 dd 的实时进度,通过管道感知,应该通过以下方式完成:

gzcat "$input" | dd bs="$block_size" count="$count" of="$output" 2>&1 | awk '/copied/ {print $1}'
gzcat "$input" | dd status=progress of="$output" 2>&1 | awk '/copied/ {print $1}'

但他们不会打印任何内容,直到最后打印一行。

我猜这是因为dd不打印任何换行符,因此 awk 不会在标准输入上获取任何内容。

有什么解决方法吗?

答案1

您可以更改 AWK 的记录分隔符,以按回车符而不是换行符分割其输入:

gzcat "$input" | dd status=progress of="$output" 2>&1 | awk -v RS='\r' '/copied/ {print $1}'

相关内容