如何用grep/awk正确过滤ghe-logs-tail日志并实时输出?
解决GHE日志实时过滤问题
问题根源
ghe-logs-tail会把日志内容输出到标准输出(stdout),但文件无法打开的错误信息会输出到标准错误(stderr)。默认管道|只传递stdout,所以你的grep仅处理日志内容——如果当时没有匹配的error日志,控制台就只会显示stderr的错误信息;就算有error日志,缓冲机制也可能导致实时输出失效。
正确命令示例
1. 用grep实现实时过滤
把stderr合并到stdout,同时强制行缓冲保证实时输出:
ghe-logs-tail 2>&1 | grep --line-buffered -i "error"
2>&1:将错误信息重定向到stdout,让grep能同时处理日志内容和错误信息(如果需要过滤错误信息里的error也适用)--line-buffered:强制grep每匹配到一行就立刻输出,避免因缓冲区攒满才打印导致的延迟
要是不想看到那些文件打不开的错误,直接丢弃stderr即可:
ghe-logs-tail 2>/dev/null | grep --line-buffered -i "error"
2. 用awk实现实时过滤
awk默认是行缓冲模式,处理重定向即可:
ghe-logs-tail 2>&1 | awk '{tolower($0) ~ /error/ {print}}'
同样,要丢弃错误信息就用:
ghe-logs-tail 2>/dev/null | awk '{tolower($0) ~ /error/ {print}}'
额外处理缓冲问题
如果还是存在输出延迟,可能是ghe-logs-tail自身有缓冲机制,用stdbuf强制无缓冲:
stdbuf -oL -eL ghe-logs-tail 2>&1 | grep -i "error"
-oL设置stdout为行缓冲,-eL设置stderr为行缓冲,这时候grep不需要再加--line-buffered也能实时输出
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

