Linux 入门:用 grep 在日志里快速定位问题
程序出问题的时候,第一反应往往是去翻日志。可日志文件动不动几万行,靠眼睛一行一行找,找半天也未必找得到关键那一行。这时候该请出 grep 了——它是 Linux 里最常用的文本搜索工具,名字来自 “global regular expression print”,你不用记这个全称,只要记住:grep 就是"在文件里找东西"。
最基本的用法只有三个部分:
grep "error" app.log
grep 是命令,"error" 是要找的词,app.log 是要搜的文件。执行后,grep 会把 app.log 里所有包含 error 的行原样打印出来,其他行一概不显示。日志再长,你看到的也只有含关键词的那几行。
实际用的时候,几个选项能让它顺手得多。
第一个是 -i,忽略大小写。日志里的报错可能是 Error、ERROR、error 三种写法混着来,grep -i "error" app.log 一次全找出来,不用分三次搜。
第二个是 -n,显示行号。grep -n "error" app.log 会在每行前面标上它在文件里的第几行,定位到具体位置后,再用编辑器跳过去看上下文就很快。
第三个是 -C,看上下文。只看到报错那一行常常不够,要知道它前面发生了什么:grep -C 3 "error" app.log 会把匹配行的前后各 3 行一起打印出来。数字可以自己换,-C 5 就是前后各 5 行。
这三个选项可以合起来用:grep -inC 3 "error" app.log,意思是忽略大小写、带行号、前后各带 3 行上下文。刚开始不用背组合,先把每个单独用熟,组合是水到渠成的事。
grep 不只搜一个文件。给它一个目录加 -r,它会递归搜遍里面的所有文件:
grep -r "timeout" /var/log/myapp/
这在不知道报错写进哪个文件时特别有用。配合管道还能更进一步:先用别的命令产出内容,再交给 grep 过滤,比如 dmesg | grep -i "fail",从系统启动信息里只挑出带 fail 的行。
新手最容易踩的坑有两个。第一个是关键词带特殊字符,比如搜 error: 没问题,但搜带点号的 192.168.1.1 时,点号在 grep 里是通配符,会把 192x168y1z1 之类的也匹配进来;办法是加 -F,按固定字符串搜:grep -F "192.168.1.1" app.log。第二个是搜出来的结果太多,几百行刷屏——这时先加个更具体的词缩小范围,或者用 grep "error" app.log | head -20 只看前 20 行。
再给一个真实场景里的组合:线上服务突然变慢,先 grep -i "timeout" app.log | tail -20 看最近 20 条超时记录,再用 -n 定位行号、跳到文件里看前后上下文,基本就能判断是数据库慢了、还是某个接口超时了。整个过程不到一分钟,比从头翻日志快得多。
最后给一个小练习,十分钟就能做完:在自己的电脑上找一个日志文件(没有就用 dmesg > test.log 生成一个),依次试一遍 grep "error"、grep -i、grep -n、grep -C 3,再试一次 grep -r 搜一个目录。跑通了,grep 就算入门了。明天可以接着试试把 grep 和管道、重定向串起来,日志分析的套路就基本齐了。
- 点赞
- 收藏
- 关注作者
评论(0)