![使用 xargs 连续刷新输出](https://linux22.com/image/220417/%E4%BD%BF%E7%94%A8%20xargs%20%E8%BF%9E%E7%BB%AD%E5%88%B7%E6%96%B0%E8%BE%93%E5%87%BA.png)
该函数输出下载文件的大小和传输速度,以换行符分隔。例子:
20 #<< data
3.0M #<< speed
25
1.2M
现在,事情是这样的:
output_data_func | xargs printf "Data transferred : %s\nSpeed : %s"
这个命令在成功放置数据方面效果很好,但问题是所有数据最后一次输出。我希望它在函数输出下一个值时连续不断。
我也尝试过stdbuf -o0 xargs printf ...
,但根本没有成功。
我尝试使用 echo 但无法将它们放在正确的位置。
预计有两种可能的解决方案。任何一个
- 使用 printf 连续打印或者
- 正确放置并有回声
答案1
虽然传递-n2
给每 2 个输入单词xargs
调用一个printf
而不是传递尽可能多的参数(不保证是偶数)会解决这个问题,但这意味着分叉一个进程并加载、初始化、运行、清理一个进程printf
每两行可执行一次。
最好是使用文本处理实用程序来处理文本。
甚至sed
orawk
在这里就足够了:
output_data_func | sed 's/^/Data transferred : /; n; s/^/Speed : /'
output_data_func | awk '
{getline speed; print "Data transferred : "$0"\nSpeed : "speed}'