如何将tail -f经grep过滤后的输出通过重定向写入文件
问题原因
该问题是Linux标准I/O的默认缓冲机制导致的:
当grep的输出目标是交互终端时,默认使用行缓冲模式,每匹配到一行结果就会立刻输出;但如果输出目标是普通文件,grep会默认开启全缓冲模式,只有缓冲区填满(通常为4KB/8KB)或者程序正常退出时,才会把缓冲区的内容批量写入目标文件。
你使用的tail -f是持续监听日志新增内容的常驻命令,不会主动退出,如果短时间内匹配到的内容大小没达到缓冲区阈值,内容就会一直滞留在缓冲区不会写入文件,看起来就像重定向不生效。去掉-f参数后tail执行完就会退出,下游的grep也会跟着退出触发缓冲区刷新,内容就能正常写入文件。
解决方案
方法1:给
grep加--line-buffered参数强制开启行缓冲
执行命令:tail -f /var/log/apache2/error.log | grep --line-buffered "trace1" > output.txt该参数会让
grep每匹配到一行就立刻把内容刷入输出文件,适配绝大多数使用场景。方法2:用
stdbuf工具通用调整缓冲模式
如果你使用的grep版本不支持--line-buffered参数,可以用stdbuf全局修改管道命令的输出缓冲级别:
执行命令:tail -f /var/log/apache2/error.log | stdbuf -oL grep "trace1" > output.txt其中
-oL参数表示将标准输出的缓冲模式设置为行缓冲。方法3:如果需要同时在终端查看输出、也写入文件,可以搭配
tee命令使用
执行命令:tail -f /var/log/apache2/error.log | grep --line-buffered "trace1" | tee output.txt
内容的提问来源于stack exchange,提问作者Axel Booltink
相关产品推荐
相关产品推荐

