日志里找不到报错、配置里搜不到关键词、一堆文件里要批量找内容——这些场景靠眼睛翻肯定不行,grep 就是 Linux 里干这个的标配工具。它是运维和开发每天都要敲的命令,用法却远不止 grep "xxx" file 这么简单。这篇文章把 grep 的常用参数、正则用法和实战场景一次讲透。
一、grep 基础用法
grep "error" /var/log/nginx/error.log # 在单个文件中搜索
grep "error" /var/log/nginx/*.log # 通配符匹配多个文件
grep -r "error" /var/log/nginx/ # 递归搜索目录下所有文件
搜索命中的行会整行输出,匹配到的关键词默认高亮显示(终端支持的话)。
二、高频参数:让搜索更精准
| 参数 | 作用 | 示例 |
|---|---|---|
-i |
忽略大小写 | grep -i "error" app.log |
-n |
显示行号 | grep -n "error" app.log |
-v |
反向匹配(排除) | grep -v "^#" config.conf 去掉注释行 |
-c |
统计匹配行数 | grep -c "error" app.log |
-l |
只显示包含匹配的文件名 | grep -rl "password" /etc/ |
-L |
只显示不包含匹配的文件名 | grep -rL "error" *.conf |
-w |
全词匹配,避免误伤 | grep -w "is" file 不会匹配 this/issue |
-o |
只输出匹配到的部分 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" log |
-A/-B/-C |
显示匹配行后/前/前后文 | grep -A 5 "exception" log |
-E |
使用扩展正则 | grep -E "error|fail" log |
-P |
使用 Perl 兼容正则 | grep -P "\d{4}-\d{2}-\d{2}" log |
最常用组合:grep -in "关键词"(忽略大小写+行号),查日志必备。
三、正则匹配:从关键字到模式
grep 默认支持基础正则,配合 -E 可以用扩展正则:
grep -E "^2026-09" access.log # 以 2026-09 开头的行
grep -E "error|warning|critical" log # 匹配多个关键词
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" log # 匹配 IP
grep -P "\d+\.\d+\.\d+\.\d+" log # -P 写法更简洁
grep -E "^$" file # 匹配空行
常用元字符速记:
.任意单个字符;*前一个字符重复任意次;+(-E)前一个字符至少一次;^行首;$行尾;[abc]字符集合;[0-9]数字;[^abc]非集合内字符;|(-E)或;()(-E)分组;{n,m}(-E)重复次数。
四、实战场景
1. 实时跟踪日志
tail -f /var/log/nginx/access.log | grep --line-buffered "500"
--line-buffered 保证逐行实时输出,否则管道会缓冲延迟。
2. 统计日志中的错误数量
grep -c "500" access.log # 总数
grep -oE "HTTP/[0-9.]+" access.log | sort | uniq -c # 各状态码分布
grep -E "POST /api" access.log | wc -l # 统计 API 请求量
3. 找出占用 CPU 的进程
ps aux | grep -E "nginx|php-fpm" | grep -v grep
grep -v grep 把 grep 自身进程过滤掉,是经典写法。
4. 批量替换前先搜索确认
grep -rn "http://" /var/www/ | head -n 20 # 替换前先看清哪些文件有
5. 排除注释和空行查看有效配置
grep -vE "^\s*#|^\s*$" /etc/nginx/nginx.conf
五、进阶技巧
- grep + xargs 批量操作:
grep -rl "old.com" /var/www/ | xargs sed -i 's/old.com/new.com/g',找到含关键词的文件再批量改; - 与 find 配合:
find . -name "*.php" | xargs grep -l "eval(",先限定文件类型再搜; grep -q静默模式:只判断有无匹配,用于脚本条件判断,if grep -q "error" log; then echo "有问题"; fi;- 别名配置:
alias grep='grep --color=auto'写入~/.bashrc,默认高亮。
六、常见坑
- 引号问题:带空格的模式一定要加引号
grep "hello world",否则会被拆成两个参数; - 特殊字符:
$、*、[等在正则里有特殊含义,想搜字面量要转义grep '\$' file; - 二进制文件乱码:加
-a让 grep 把二进制当文本处理,或--exclude="*.bin"排除; - 大文件性能:几 GB 的日志直接 grep 很慢,先
grep "关键词" | head,或用-m 10限制只输出前 10 个匹配就停。
总结:grep 的核心就三件事——找什么(模式)、在哪找(文件/目录)、怎么看结果(参数)。记住 -i -n -v -E -o -c -r 这几个参数,再配合正则,日常查日志、搜配置、批处理文件就完全够用了。加上 --line-buffered 配 tail -f,实时监控日志也手到擒来。




