通过管道传输到 awk 的 Bash 命令有时会被缓冲



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

命令:

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

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

awkcat替换时,按预期每 5 秒打印一行。

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

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

@Ed Morton :我确实尝试在每次打印后添加fflush((,但它不起作用——这表明问题出在 awk 的输入上,而不是输出上。 我还尝试添加对system("date"(的调用,这表明 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.

这似乎解决了问题!

感谢所有回复者。

最新更新