管道命令不打印换行符(但使用 \r)

pipe a command not printing newline (but using \r)

我想通过管道传输不打印换行符的程序的输出,因为它使用回车 return 用新内容替换它的行。

此代码表示我想要检索输出的程序的行为。

#!/usr/bin/env bash                                                             

for i in {1..100};do                                                            
    echo -ne "[ $i% ] long unneeded log\r"                                            
    sleep 0.3                                                                   
done

我想在 bash 脚本中实时剪切此输出以仅显示重要信息, 但由于程序不打印换行符,./program | awk ... 仅在命令结束时显示输出。

我无法修改提供此输出的程序,我正在尝试 trim。 (我没有它的来源+我想与其他用户分享我自己的脚本)

我知道我的要求很具体,但是有没有一种方法可以逐个字符而不是逐行通过管道输出输出?

你可以试试

./program | tr '\r' '\n'

您可以继续使用第三个程序进行管道处理,该程序将逐行处理。

将您的 echo 命令更改为:

echo -ne

收件人:

echo -e

来自 echo 文档:

‘-n’
     Do not output the trailing newline.

我找到它要归功于@OznOg 答案和@Walter-A link.

确实用换行符 tr 替换回车符 returns 是可行的, 但默认情况下它是缓冲的,stdbuf 可以用 stdbuf -o0.

取消缓冲

所以最后的命令是:

./program | stdbuf -o0 tr '\r' '\n' |  awk -F'[][]' '{printf  "\r"}'

这确实打印了括号之间的第一个匹配项,带有回车 return。

因此在单个更新行 [x%] long compile detail 上显示的程序实时日志将缩写为 x%,仍然使用 1 行。