Linux 入门:用 grep 在日志里快速定位问题

举报
Xavian 发表于 2026/11/09 06:17:44 2026/11/09
【摘要】 程序出问题的时候,第一反应往往是去翻日志。可日志文件动不动几万行,靠眼睛一行一行找,找半天也未必找得到关键那一行。这时候该请出 grep 了——它是 Linux 里最常用的文本搜索工具,名字来自 “global regular expression print”,你不用记这个全称,只要记住:grep 就是"在文件里找东西"。最基本的用法只有三个部分:grep "error" app.logg...

程序出问题的时候,第一反应往往是去翻日志。可日志文件动不动几万行,靠眼睛一行一行找,找半天也未必找得到关键那一行。这时候该请出 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 和管道、重定向串起来,日志分析的套路就基本齐了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。