如何配合tail -f命令将grep输出传递给sed处理日志
无输出的核心原因
你单独跑每个环节的命令都正常,串到tail -f的管道里没输出,完全不是命令逻辑写错了,是管道环境下的命令缓冲机制不对位:
grep、sed这类文本处理命令默认的输出规则:当输出直接打在终端上时,会用行缓冲——遇到换行就立刻把内容打出来;一旦输出接了管道、或者重定向到文件,就会自动切成全缓冲——必须攒够几KB的内容,才会一次性把缓冲区的内容吐出来。tail -f是逐行刷新增日志的,不会一下子传一大堆内容给后面的管道命令,导致中间的grep、sed永远攒不满全缓冲的阈值,内容一直卡在内存里不往外打,最后终端就只剩闪的光标,啥输出都没有。
修正方法
只要给管道中间的文本处理命令加上强制行缓冲的参数,问题直接解决:
- 给
grep加--line-buffered,强制它遇到换行就刷内容,别攒缓冲 - 给
sed加--unbuffered,强制它遇到换行就刷内容,别攒缓冲
你之前试的两种逻辑,改完就能正常用的命令:
- 先筛出带error的行,再去掉行首的11个字符(就是日期段):
tail -f /path/to/file.log | grep --line-buffered error | sed --unbuffered 's/^...........//' - 先把所有行的行首11个字符去掉,再筛带error的内容:
tail -f /path/to/file.log | sed --unbuffered 's/^...........//' | grep --line-buffered error
小提醒:sed的替换式里最好加
^锚定行首,不然万一日志内容里刚好有连续11个会被匹配的字符,会被误删掉,逻辑更稳。
内容的提问来源于stack exchange,提问作者Banoncom
相关产品推荐
相关产品推荐

