RHEL 7下Shell脚本经gawk处理后输出重定向文件为空的解决咨询
解决重定向gawk输出到文件为空的问题
问题根源是输出缓冲机制差异:当程序输出指向终端时,系统默认用行缓冲(每输出一行就刷新缓冲区);但输出指向文件或管道时,会切换为块缓冲(缓冲区满才写入磁盘),导致内容无法实时出现在文件里。
以下是几种可行的解决方法:
强制gawk行缓冲
在gawk脚本中每次打印后调用fflush()刷新缓冲区,命令修改为:./loop-test.sh | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush() }' > t.txt也可以用GNU awk的交互式模式参数强制行缓冲:
./loop-test.sh | gawk -W interactive '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' > t.txt用stdbuf调整缓冲区
使用stdbuf命令将gawk的标准输出设置为行缓冲:./loop-test.sh | stdbuf -oL gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' > t.txt其中
-oL参数表示强制标准输出使用行缓冲。调整原脚本的输出缓冲
如果需要从源头解决,也可以让原shell脚本的输出强制行缓冲,再配合gawk处理:stdbuf -oL ./loop-test.sh | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' > t.txt
内容的提问来源于stack exchange,提问作者Murthy
相关产品推荐
相关产品推荐

