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

时间:2019-06-26 16:39:37

标签: bash pipe carriage-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 ...仅在命令结束时显示输出。

我无法修改提供此输出的程序。 (我没有来源,我想与其他用户共享自己的脚本)

我知道我的请求非常具体,但是有一种方法可以按字符而不是按行传递输出字符?

3 个答案:

答案 0 :(得分:0)

您可以尝试

<option>

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

答案 1 :(得分:0)

由于@OznOg答案和@ Walter-A链接的结合,我找到了它。

实际上是用tr用换行符替换回车符, 但默认情况下它是缓冲的,stdbuf可以用stdbuf -o0对其进行缓冲。

最后一条命令是:

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

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

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

答案 2 :(得分:-1)

从以下位置更改您的echo命令:

button.btn {
    margin: 0 1px;
}

收件人:

echo -ne

从echo文档:

echo -e