用bash / sh分别管stderr和stdout

时间:2014-02-22 01:51:08

标签: linux bash shell dd

我一直在尝试在我的服务器上使用以下命令 dd if=/dev/zero bs=1M count=1024 | md5sum

输出:

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s
cd573cfaace07e7949bc0c46028904ff  -

如何让它仅显示速度(367 MB/s)作为输出?状态将打印到stderr

我目前正在使用awk,但它显示了md5哈希。

得到赞赏:)

1 个答案:

答案 0 :(得分:3)

首先,模拟命令的功能

simulation() { 
  echo "1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s" >&2
  echo "cd573cfaace07e7949bc0c46028904ff  -"
}

$ simulation >/dev/null
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s

$ simulation 2>/dev/null
cd573cfaace07e7949bc0c46028904ff  -

然后,解决方案:将stderr重定向到进程替换,将所需的输出显示回stderr,捕获变量中的stdout。

$ md5sum=$( simulation 2> >(sed -n '/MB\/s/ {s/.*, //p; q}' >&2) )
367 MB/s

$ echo $md5sum
cd573cfaace07e7949bc0c46028904ff -