有时,程序输出的内容默认会自行覆盖。
例如, 的输出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 中)