管道命令不打印换行符(但使用 \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 行。
我想通过管道传输不打印换行符的程序的输出,因为它使用回车 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 行。