我可以缩进 pv 的输出(或任何输出 CR 的命令)吗?

我可以缩进 pv 的输出(或任何输出 CR 的命令)吗?

使用pv,我可以显示通过它传输的任何内容的进度条,例如

echo 1234567890 | pv --size 10 >/dev/null

它会打印一个漂亮的进度条,每当有更多数据通过时,进度条就会更新(当然,在这个例子中应该非常快,但由于数据只到达,所以不是很有用/dev/null)。

我可以以某种方式缩进 的输出吗pv?想象一下这样的一个脚本,它浏览我派对的所有受邀者的列表,给他们打电话,与他们交谈,然后写入控制台,看看他们是否想参加派对:

echo "The next person on the list is Berta." ;\
echo "    Calling Berta..."; \
echo "    Berta answered the phone. Talking..."; \
printf "    "; \
for word in TALK TALK TALK TALK TALK; do 
    printf $word; sleep 1; 
done | pv --size 20 --width 100 >/dev/null; \
echo "    Berta said she would come to the party."

如果你尝试一下,你会发现,第一的pv 进度条的输出将在 printf 打印的四个空白之后开始,但第一次更新将跳回到开头的行(可能带有 CR),之后导致以下输出:

The next person on the list is Berta.
    Calling Berta...
    Berta answered the phone. Talking...
20.0 B 0:00:05 [3.53 B/s] [======================================================>] 100%            0:01
    Berta said she would come to the party.

有什么方法可以防止 pv(或任何其他发出 CR 的命令)跳回到行首?像示例这样的长时间运行的命令的输出如果缩进,可读性会更高。

答案1

特定于的解决方案pv:使用-F/--format并在格式字符串中包含四个前导空格。

-F--format FORMAT
忽略选项-p-t-e-r-a-b和,而是使用格式字符串-T来确定输出格式。请参阅格式化部分 […]。-AFORMAT

(来源:man 1 pv

我不会在这里引用格式化部分。请参阅man 1 pv


例子:

echo "The next person on the list is Berta." ;\
echo "    Calling Berta..."; \
echo "    Berta answered the phone. Talking..."; \
for word in TALK TALK TALK TALK TALK; do 
    printf '%s' "$word"; sleep 1; 
done | pv -F '    %p' --size 20 >/dev/null; \
echo "    Berta said she would come to the party."

相关内容