将“dd”的输出发送到 awk/sed/grep

8 shell bash io-redirection python dd

我正在尝试使用 dd 来近似计算机的写入速度:

dd if=/dev/urandom of=/dev/null bs=1K count=10000
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出

10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.746313 s, 13.7 MB/s
Run Code Online (Sandbox Code Playgroud)

如何将“13.7 MB/s”转换为 bash 变量?我尝试将 dd 的输出通过管道传输到 awk、sed 和 grep 等 prog,但无济于事。

最终,我os.system(...)从 python 脚本中调用它。如果有人知道在 python 中获得类似结果的更直接的方法,我也会对此感兴趣。我试图根据文件大小预测文件副本需要多长时间。

任何帮助将不胜感激。

Ulr*_*gel 11

问题是你从 dd 指定的输出转到STDERR而不是STDOUT所以你必须重定向STDERR,而不仅仅是STDOUT.

对于 bash 和 zsh,您可以使用which|&代替|which 也将重定向STDERRSTDIN第二个命令,例如:

dd if=/dev/urandom of=/dev/null bs=1K count=10000 |& awk '/copied/ {print $8 " "  $9}'
Run Code Online (Sandbox Code Playgroud)

更通用的方法是使用 显式重定向 STDERR 2>&1,例如:

dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1 | awk '/copied/ {print $8 " "  $9}'
Run Code Online (Sandbox Code Playgroud)

对于 python 部分,请查看 subprocess 模块Popen,特别是。