用 grep 检索文本:常用选项与正则入门
grep 是 Linux 里按行搜索文本的命令,基本格式是 grep [选项] 模式 文件。它最常见的用途是查日志:在成千上万行输出里把包含关键字的行挑出来。最简单的例子是 grep "ERROR" app.log,只打印含 ERROR 的行;模式里有空格或特殊字符时记得加引号,否则 shell 会先把它拆开。
几个每天都会用到的选项:-i 忽略大小写,日志里 Error、error 混写时很有用;-n 显示行号,方便定位后再去看原文;-r 递归搜索整个目录;-v 反选,打印不匹配的行;-c 只输出匹配的行数。组合起来,grep -rin "timeout" /var/log/app/ 就能把某个目录下所有提到 timeout 的位置一次找齐。
只看到匹配行往往不够,报错的前因后果同样重要。-A n 显示匹配行和它后面的 n 行,-B n 显示前面的 n 行,-C n 前后都显示。查异常堆栈时常用 grep -C 5 "Exception" app.log,先把出错点连同上下文一起圈出来,再判断是偶发还是必现。
需要更灵活的匹配时用正则:^ 和 $ 分别锚定行首和行尾,. 表示任意一个字符,* 表示前面的内容重复任意次,[0-9] 这类括号表示字符范围。默认 grep 用基础正则,加 -E 切换到扩展正则后,可以直接用 +、? 和 |,比如 grep -E "error|failed|timeout" app.log 一次匹配多个关键词,省去跑三遍。
grep 的另一半威力在管道里:ps aux | grep nginx 查进程,journalctl -u sshd | grep -i "failed" 看登录失败记录。查进程时有个小坑:结果里会混进 grep 自己这一行,经典解法是把模式写成 grep "[n]ginx",匹配的是 nginx 本身、又不会匹配到方括号写法。
小结一下使用顺序:先用 -n 快速定位关键字,再用 -C 看上下文,最后用 -E 写更精确的过滤条件。把这三步练熟,大部分日志排查都可以在一分钟内锁定范围。
- 点赞
- 收藏
- 关注作者
评论(0)