Linux 新手入门:用 grep 在日志里把报错找出来
前面几篇学会了看服务状态、发请求、查磁盘,接下来最常用的一招,是在日志里找报错。服务出问题时,日志往往已经把原因写下来了,关键是你得会把它翻出来——grep 就是干这个的。
先看最简单的用法,在一个文件里找包含某个词的行:
grep "error" /var/log/syslog
grep 后面跟要找的词,再跟文件名,命中的行会原样打印出来。词要加引号,里面有空格或特殊字符也不会被拆散。找不到东西时它什么也不输出,先别急着下结论,可能是词写错了,也可能是日志根本不在这个文件里。
报错的写法五花八门,error、Error、ERROR 可能同时出现。加 -i 忽略大小写,一次全找出来:
grep -i "error" /var/log/syslog
只想知道有没有、而不想看全文时,加 -c 只数行数:
grep -c -i "error" /var/log/syslog
数字是 0,说明这个文件里确实没有;数字突然比平时大很多,说明出问题的时间点就在附近。先数数、再细看,是个省时间的好习惯。
日志里真正有用的往往不是报错本身,而是它前后发生了什么。-B 2 显示命中行前面的 2 行,-A 2 显示后面的 2 行:
grep -i -B 2 -A 2 "error" /var/log/syslog
这样能看到报错前系统在做什么、报错后服务又做了什么,定位比只看一行准得多。两个选项可以只用一个,也可以一起用。
很多时候要找的不是一个词,而是一类东西。比如只看某个服务的记录,用它的名字过滤:
grep "nginx" /var/log/syslog
再比如把两个条件叠起来:先找出今天的,再在里面找报错。管道可以把两次过滤串起来:
grep "Nov 8" /var/log/syslog | grep -i "error"
前一个 grep 的输出直接变成后一个的输入,不用先存中间文件。排查时这类组合很常见:先按时间或服务名缩小范围,再按报错词精确定位。
还有两个新手容易踩的坑。第一,grep 默认只在单个文件里找,目录下的日志是按日期分开的,一个个翻很慢——加 -r 可以递归搜整个目录:
grep -r -i "error" /var/log/
第二,有些日志文件很大,直接搜会等很久,先用 tail 只看最后几百行,再在里面找:
tail -n 200 /var/log/syslog | grep -i "error"
服务刚出问题时,答案基本都在日志的最后一段里,没必要从头翻起。
总结一下排查顺序:先用 grep -i 找报错词,再用 -B、-A 看上下文,范围太大就用管道两次过滤或 tail 先截尾。配合前面学过的 systemctl 看状态、journalctl 看服务日志,报错从哪来、发生前发生了什么,基本就能拼出一幅完整的图。
- 点赞
- 收藏
- 关注作者
评论(0)