繁体   English   中英

管道输入到awk的Bash命令有时会被缓冲

[英]Bash commands piped to awk are sometimes buffered

系统:Linux 4.13.0-43-generic#48~16.04.1-Ubuntu BASH_VERSION ='4.3.48(1)-release'

命令:

while sleep 5
do
  date +%T
done | awk -F: '{print $3}'

应该打印“日期”输出的第3个字段(秒),每5秒一行。 问题:awk从管道读取,并仅在管道缓冲区已满时处理其输入。 即当产生超过4K的输入时。

当用cat替换awk时 ,按预期每5秒打印一行。

这个代码片段是从一个在其他系统上工作正常的shell脚本简化的,所以在这个系统中必须有关于bash,awk及其配置的东西。

简而言之,有没有办法说服awk在从管道读取时表现得像猫一样

@Ed Morton:我确实尝试在每次打印后添加fflush() ,但它不起作用 - 这表明问题在于awk的输入,而不是输出。 我还尝试添加对系统的调用(“日期”) ,这表明确实awk一次获取所有输入行,而不是在生成时立即获取。

对于那些问:

$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040

在试图找出如何使awk打印其版本时,我发现它确实是mawk ,并且它具有以下标志:

 -W interactive -- sets unbuffered writes to stdout and line buffered reads from stdin.
                   Records from stdin are lines regardless of the value of RS.

这似乎解决了这个问题!

感谢所有的回复者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM