连续读取自覆盖输出并解析行

连续读取自覆盖输出并解析行

有时,程序输出的内容默认会自行覆盖。
例如, 的输出dd if=(something) of=(something) status=progress具有以下输出模型:

56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s

并且值不断变化而不打印新行(因此,自覆盖输出)。

我使用以下脚本复制了此行为:

#!/bin/sh
# POSIX!

limit=50
i=1; while [ $i -le $limit ]; do
  echo -n "testing $i\r"
  i=$(($i + 1))
done

因此,每秒都会将以下行替换为当前数字,而不打印(附加)其他行:

testing <number>

问题是:我怎样才能连续观察这种输出来解析和处理信息?

例如,我想获取 dd 的输出并以某种方式解析它,以获得一定百分比的结论。类似于:

# This is the output model:
# 56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s

# Parsing the output
dd if=/dev/sda1 of=/dev/sdb1 status=progress | awk '{print $3}' | cut -d '(' -f 2 | awk '{print $1"GB concluded of 10000GB"}'

我希望至少能得到打印行的附加内容,显示:

1GB concluded of 10000GB
2GB concluded of 10000GB
...

但相反,什么也没有发生,输出被管道完全忽略。

要在这些情况下重现 dd 的输出,您可以使用上面的脚本作为模型:

#!/bin/sh
limit=50
i=1; while [ $i -le $limit ]; do
  echo -n "56670413312 bytes ($i GB, 53 GiB) copied, 1938 s, 29.2 MB/s\r"
  i=$(($i + 1))
  sleep 1
done

我怎样才能持续获得输出以我想要的方式解析? (最好是在 POSIX 中)

相关内容