Linux grep 命令详解与实战:文本搜索、正则匹配与多文件批量处理


日志里找不到报错、配置里搜不到关键词、一堆文件里要批量找内容——这些场景靠眼睛翻肯定不行,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,默认高亮。

六、常见坑

  1. 引号问题:带空格的模式一定要加引号 grep "hello world",否则会被拆成两个参数;
  2. 特殊字符:$、*、[ 等在正则里有特殊含义,想搜字面量要转义 grep '\$' file;
  3. 二进制文件乱码:加 -a 让 grep 把二进制当文本处理,或 --exclude="*.bin" 排除;
  4. 大文件性能:几 GB 的日志直接 grep 很慢,先 grep "关键词" | head,或用 -m 10 限制只输出前 10 个匹配就停。

总结:grep 的核心就三件事——找什么(模式)、在哪找(文件/目录)、怎么看结果(参数)。记住 -i -n -v -E -o -c -r 这几个参数,再配合正则,日常查日志、搜配置、批处理文件就完全够用了。加上 --line-buffered 配 tail -f,实时监控日志也手到擒来。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux awk 命令详解与实战:字段分割、条件过滤与数据统计

Linux 磁盘分区与挂载完整指南:fdisk、mkfs、mount 与 fstab 开机自动挂载

评 论
更换验证码