1. 基础概念
grep
是 Linux 下的文本搜索工具,核心功能是从文件或输入流中筛选出包含指定关键词的行。
它像“文本界的搜索引擎”,能快速定位关键信息,特别适合日志分析、代码排查等场景。
2. 基础语法
grep [选项] "搜索词" 文件名
3. 常用选项与实例
① 简单搜索
# 在 catalina.out 中查找包含 "ERROR" 的行
grep "ERROR" catalina.out# 示例输出:
# 2023-10-25 14:00:10 ERROR NullPointerException...
# 2023-10-25 14:05:20 ERROR Database connection failed...
② 忽略大小写(-i)
# 查找 "error"(不区分大小写,匹配 ERROR/error/Error)
grep -i "error" catalina.out
③ 显示行号(-n)
# 显示匹配行及其行号(方便定位到文件具体位置)
grep -n "NullPointer" catalina.out# 示例输出:
# 105:2023-10-25 14:00:10 ERROR NullPointerException...
④ 反向匹配(-v)
# 排除包含 "INFO" 的行(只显示不匹配的行)
grep -v "INFO" catalina.out
⑤ 显示上下文(-A/-B/-C)
# 显示匹配行及其后5行(After)
grep -A 5 "OOM" catalina.out # 适合查看堆栈信息# 显示匹配行及其前3行(Before)
grep -B 3 "Timeout" catalina.out# 显示匹配行前后各2行(Context)
grep -C 2 "WARN" catalina.out
⑥ 正则表达式(-E)
# 使用正则匹配(例如:以 "ERROR" 开头或包含 "404")
grep -E "^ERROR|404" catalina.out# 等价于:
egrep "^ERROR|404" catalina.out
⑦ 统计匹配次数(-c)
# 统计 "ERROR" 出现的总次数
grep -c "ERROR" catalina.out# 统计每个文件的匹配次数(多文件时)
grep -c "404" access.log error.log
⑧ 递归搜索目录(-r)
# 在 /var/log 目录下所有文件中搜索 "Timeout"
grep -r "Timeout" /var/log# 同时显示文件名和行号
grep -rn "Timeout" /var/log
⑨ 匹配整词(-w)
# 只匹配完整单词 "Error"(避免匹配到 "Errors" 或 "ErrorCode")
grep -w "Error" catalina.out
4. 实战场景
场景1:快速定位 Tomcat 启动失败原因
# 查看启动日志中的错误
grep -A 20 "ERROR" catalina.out | less
场景2:统计接口 500 错误次数
# 在访问日志中统计 500 状态码
grep " 500 " access.log | wc -l
场景3:过滤无关日志
# 只看 ERROR 和 WARN,排除 INFO 和 DEBUG
grep -E "ERROR|WARN" catalina.out | grep -v "INFO\|DEBUG"
场景4:搜索指定时间段的日志
# 先按时间截取日志,再过滤关键词
sed -n '/2023-10-25 14:00:/,/2023-10-25 15:00:/p' catalina.out | grep "ERROR"
5. 性能技巧
- 大文件搜索:先用
grep
过滤,再用其他命令处理,避免内存溢出。grep "ERROR" huge.log | awk '{print $1}' # 先过滤再提取列
- 压缩文件搜索:无需解压,直接使用
zgrep
。zgrep "404" access.log.gz
总结
grep
是 Linux 文本处理的瑞士军刀,核心能力 = 关键词搜索 + 正则匹配。
掌握常用选项后,可以快速解决以下问题:
- 日志分析:定位错误、统计异常
- 代码调试:查找函数调用、追踪变量
- 数据清洗:过滤无效数据、提取关键字段
记住万能公式:
grep [选项] "搜索词" 文件 | 其他命令
(如结合 awk
、sort
、wc
等进一步处理结果)