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

时间:2018-06-06 14:56:09

标签: linux bash awk mawk

系统:Linux 4.13.0-43-generic#48~16.04.1-Ubuntu BASH_VERSION =' 48年3月4日(1)-release'

命令:

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

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

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

这个代码片段是从一个在其他系统上运行良好的shell脚本简化而来的,所以在这个系统中必须有关于bash,awk及其配置的东西。

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

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

对于那些问:

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

compiled limits:
max NF             32767
sprintf buffer      2040

1 个答案:

答案 0 :(得分:1)

在尝试了解如何使 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.

这似乎解决了这个问题!

感谢所有回复者。