PV 命令用于在对话框中显示进度(传输速率以 Mbits 为单位)

PV 命令用于在对话框中显示进度(传输速率以 Mbits 为单位)

我使用 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"

将为您提供经过时间的百分比和预计到达时间

相关内容