我使用 PV -n 命令读取分区,并使用 gzip 和管道来压缩读取的数据并存储文件。在读取和写入数据时,我使用 while 循环来使用 Linux 对话框实用程序显示进度。
这很好用,进度已更新。我还想显示传输速度/读取速度(以兆位为单位)。另外,我想更新数据库表的进度以及传输速度(以兆位为单位)。
由于我使用 while 循环来读取每一行,因此每次更新的进度都应显示在新行上。请参阅下面我的代码。
(pv -n /dev/$partitions | gzip -c >$path/${filename// /_}-${partitions}.img.gz) 2>&1 | while IFS= read -r progress;
do
echo "processing /dev/$partitions currently completed $progress" >/run/log.log
echo $progress | dialog --title "Capturing OS image of $hdd" --gauge " now creating image of HDD $hdd writing $filename Image, please wait...\n\n\n
Processing Partition $i of $totalparts\n\n
This process may take some time to complete\n\n" 13 90 0
mysql -u root -pxxxxxx dbi -h localhost | insert into speed(progress, speed) Values ("$line", "mbits")
done
如果我使用 pv -n 命令,它只会在换行符上返回进度的数值。请参见下面的示例:
( /data/pv -n /dev/nvme0n1p1 | gzip -c >/run/test.img )
5
9
29
67
100
上面的进度条非常有用,但我想以平均速度(以兆位为单位)更新我的数据库。
当我以平均速度增量运行 pv 命令获取进度时,进度会在同一行上更新,而不是打印新行,这会破坏我的脚本。请参见下面的示例。
(pv -rep /dev/nvme0n1p1 | gzip -c >/run/test.img )
[4.9MiB/s] [====> ] 4% ETA 0:00:19
理想的输出应该是这样的。
(pv -rep /dev/nvme0n1p1 | gzip -c >/run/test.img )
[ 4.18MiB/s] [====> ] 14% ETA 0:00:19
[14.49MiB/s] [===========> ] 54% ETA 0:00:19
[24.39MiB/s] [========================> ] 74% ETA 0:00:19
[44.29MiB/s] [===========================> ] 78% ETA 0:00:19
[46.19MiB/s] [=============================> ] 98% ETA 0:00:19
[57.99MiB/s] [==============================>] 100% ETA 0:00:19
我可以使用 AWK、Sed 和 Grep 来格式化所需的数据并在 while 循环中使用它。但我怎样才能让它发挥作用。
如果我使用 pv -F $'%t %r %e\n' 我会得到所需的结果。但我无法使用 AWK、grep 或 tr 命令。请参阅下面的示例,它什么也不返回。
(pv -F $'%t %r %e\n' /dev/nvme0n1p1 | gzip -c >/run/test.img ) 2>&1 | tr -d ':[]'
此外,如果我不将 stderr 重定向到 stdout,使用上面相同的命令,我无法获得预期的结果,请参见下文,使用 tr -d 删除以下字符“:[]”但不起作用。
(pv -F $'%t %r %e\n' /dev/nvme0n1p1 | gzip -c >/run/test.img ) | tr -d ':[]'
0:00:01 [25.2MiB/s] ETA 0:00:18
0:00:02 [23.7MiB/s] ETA 0:00:18
0:00:03 [ 100MiB/s] ETA 0:00:07
0:00:04 [ 199MiB/s] ETA 0:00:01
如果我使用其他参数,例如 pv -n -r -e,它会忽略所有其他参数,仅在换行符上返回数字进度值。
也许有一个 pv 的替代方案,我可以用它来实现上面描述的功能,或者也许有人可以帮助使用 pv 命令。
答案1
使用 -F 格式化输出:
例如:
pv -F "%T %t %r %e"
将为您提供经过时间的百分比和预计到达时间