系统: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
答案 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.
这似乎解决了这个问题!
感谢所有回复者。