概述
需求描述:
前两天接到朋友求助,说写了个监控日志关键词的shell,希望通过 tail -f | grep 命令实现将过滤出来的信息实时重定向到文件中,但运行后发现重定向的文件一直为空,确认了各种可能错误,一直不得其解。
问题分析:
咋一看,似乎是一个很简单的问题,就是 taif -f | grep 过滤出来的内容重定向到文件中就行了,但是为什么文件一直为空呢?
其实这要从shell的输出机制说起,因为标准输出到终端时默认行缓冲或无缓冲,重定向到硬盘之后,就变成了全缓冲。
因此 tail -f 往终端打印,和往文件中写是不一样的,往文件中写,需要先写到pipe的缓冲区中, 然后再写到文件中。tail -f 之后表示一个流还没有完成, 缓冲区不会自动写,因此导致内容无法写入文件。
解决方法呢?很简单,既然缓冲区不自动写,那我们就强制写。方法不止一种,此处我们单讲 fflush:
fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
以上是百度百科中对fflush释义,在shell中,我们可以使用awk来调用fflush,话不多说,先上shell:
tail -f xxx.log | awk '/china|beijing/ {print $0; fflush() }' >> out.txt
此命令即实现实时过滤 xxx.log 文件中的关键词 china 或 beijing ,并将对应的行输出到out.txt文件中。
最后
以上就是鲤鱼小鸭子为你收集整理的tail -f 过滤结果实时输出重定向到文件的全部内容,希望文章能够帮你解决tail -f 过滤结果实时输出重定向到文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复