使用 grep 在日志文件中查找特定文字是 Linux/Unix 系统中最常用的操作之一。以下是详细、实用的方法汇总:
🔍 基本语法
grep [选项] "要查找的文字" 日志文件路径
✅ 常用示例
1. 简单查找(区分大小写)
grep "error" /var/log/syslog
查找所有包含小写
error的行。
2. 忽略大小写
grep -i "error" /var/log/nginx/error.log
匹配
Error、ERROR、error等。
3. 显示行号
grep -n "timeout" app.log
输出:
42:Connection timeout occurred(第 42 行)
4. 显示匹配行的上下文
- 显示匹配行 前后各 3 行:
grep -C 3 "exception" debug.log - 仅显示 前 2 行 + 匹配行:
grep -B 2 "crash" system.log - 仅显示 匹配行 + 后 5 行:
grep -A 5 "database" app.log
💡
-C= context,-B= before,-A= after
5. 反向查找(排除某内容)
grep -v "INFO" application.log
显示不包含
INFO的所有行(常用于过滤掉无用日志)。
6. 统计匹配行数
grep -c "404" /var/log/apache2/access.log
输出数字,如
23(表示有 23 次 404 请求)。
7. 递归查找目录下所有日志文件
grep -r "OutOfMemory" /var/log/
在
/var/log/及其子目录中所有文件里搜索。
加上
-l只显示文件名(不显示内容):grep -rl "password" /var/log/
8. 使用正则表达式
- 查找以
2025-01-开头的行(日期):grep "^2025-01-" app.log - 查找包含数字的错误码:
grep "Error [0-9]\+" app.log - 使用扩展正则(推荐加
-E):grep -E "(timeout|failed|denied)" security.log
9. 高亮匹配内容(终端支持颜色时)
grep --color=always "warning" messages.log
或设置别名永久生效:
alias grep='grep --color=auto'
10. 实时监控日志并过滤(结合 tail)
tail -f /var/log/syslog | grep "ssh"
实时显示新增的包含
ssh的日志行(按Ctrl+C退出)。
🛠️ 高级技巧
▶ 多关键词“或”匹配
grep -E "error|critical|fatal" app.log
▶ 多关键词“与”匹配(需同时出现)
grep "error" app.log | grep "database"
▶ 匹配完整单词(避免匹配到子串)
grep -w "load" system.log
不会匹配
loaded或reloading。
▶ 查找空行或非空行
grep -v "^$" file.log # 过滤空行
grep "^$" file.log # 只显示空行
⚠️ 注意事项
- 日志文件通常较大,建议配合
less或head使用:grep "error" huge.log | less - 某些日志需
sudo权限才能读取:sudo grep "denied" /var/log/auth.log - 中文或特殊编码日志:确保终端编码一致(一般 UTF-8 无问题)。
📌 总结:最常用组合
| 场景 | 命令 |
|---|---|
| 快速查错 | grep -i "error" app.log |
| 实时跟踪 | tail -f app.log | grep "user123" |
| 统计次数 | grep -c "404" access.log |
| 上下文排查 | grep -C 5 "NullPointerException" debug.log |
掌握这些,你就能高效地在日志海洋中精准定位问题!