实时查看日志需加--line-buffered参数解决grep缓冲问题,如tail -f /var/log/syslog | grep --line-buffered "Failed login";老版本可用stdbuf -oL;配合-A/-B/-C查看上下文、-iE处理大小写与多关键词,避免匹配自身进程可用[n]ginx技巧。

tail -f 实时看日志时怎么加关键词过滤
直接用 tail -f /var/log/syslog | grep "ERROR" 看不到实时匹配结果,是因为 grep 默认启用缓冲,等满一屏或遇到换行才输出——而 tail -f 持续吐新行,grep 卡在等缓冲填满。
必须加 --line-buffered 强制行级刷新:
tail -f /var/log/syslog | grep --line-buffered "Failed login"
- 不加这个参数,可能等几十秒才突然刷出一堆匹配项,甚至一直没输出
- 某些老版本
grep(如 CentOS 6 自带的)不支持该参数,得换stdbuf -oL grep "xxx" - 如果日志路径含空格或特殊字符,建议用引号包裹路径,但关键词本身不用引号(除非含空格)
grep -A -B -C 查看关键词上下文行数
只看到匹配行往往不够,比如查 "Connection refused",需要看它前几行有没有重试记录、后几行有没有堆栈。
-A(after)、-B(before)、-C(context)控制额外输出行数:
grep -C 3 "Connection refused" /var/log/nginx/error.log
-
-C 3等价于-A 3 -B 3,共输出 7 行(含匹配行) - 生产环境慎用大数字(如
-C 100),日志量大时卡顿明显,优先用tail -n 200 xxx.log | grep -C 2 "xxx"限定范围 - 注意:如果匹配行靠近文件开头/结尾,
-B/-A不会报错,只是少输出几行
grep -i -E 处理大小写和多关键词
系统日志里关键词大小写不统一(如 "error"、"ERROR"、"Error"),还可能要同时查几个相关词(如 "timeout" 和 "refused")。
用 -i 忽略大小写,-E 启用扩展正则:
grep -iE "(timeout|refused|fail)" /var/log/auth.log
-
-i是最常用也最容易被漏掉的参数,不加就可能漏掉一半日志 -
-E后面的括号必须是英文括号,且管道符|前后不能有空格(否则当字面量匹配) - 如果关键词含正则元字符(如
.、*、[),要么用grep -F(固定字符串模式),要么转义:grep "502\.Bad\.Gateway"
避免 grep 匹配到 grep 进程自身(ps aux | grep 场景)
在查日志进程时,有人习惯写 ps aux | grep nginx,结果总看到两行:一行是 nginx 主进程,另一行是 grep nginx 自己。查日志时同理,比如 tail -f /var/log/syslog | grep "nginx" 没问题,但若用 ps 辅助定位日志来源,就容易误判。
绕过方法很简单,用方括号模糊匹配关键词:
ps aux | grep "[n]ginx"
- 原理是
[n]ginx正则匹配nginx,但进程命令行里实际是grep [n]ginx,不满足匹配条件 - 这个技巧只适用于
ps类场景,日志内容里不用这么干;但如果你在脚本里自动化查日志并统计进程,要注意别把grep自身混进去 - 更稳妥的做法是用
pgrep nginx替代ps | grep
tail -f 配合 --line-buffered 是刚需,而上下文和大小写处理决定你能不能一眼抓住根因。很多人卡在第一关——看着 tail | grep 没输出,反复检查路径和关键词,却忘了缓冲区这回事。


















