一、grep 命令简介
`grep`(Global Regular Expression Print)是 Linux 中用于文本搜索的核心工具,支持正则表达式,能快速定位文件中的目标内容。
二、常用选项(Options)及英文对照
| 选项 | 英文全称 | 作用 |
|------|----------|------|
| `-i` | `--ignore-case` | 忽略大小写 |
| `-c` | `--count` | 统计匹配行数 |
| `-n` | `--line-number` | 显示行号 |
| `-o` | `--only-matching` | 仅输出匹配内容 |
| `-A` | `--after-context=N` | 显示匹配行后 N 行 |
| `-B` | `--before-context=N` | 显示匹配行前 N 行 |
| `-C` | `--context=N` | 显示匹配行前后各 N 行 |
| `-r` | `--recursive` | 递归搜索目录 |
| `-w` | `--word-regexp` | 匹配完整单词 |
| `-E` | `--extended-regexp` | 启用扩展正则表达式 |
三、实战场景与示例
1. 统计文件中 `error` 出现的次数(忽略大小写)
说明:统计 `app.log` 中所有包含 `error` 的行数(不区分大小写)。
命令:
grep -i -c 'error' app.log
2. 搜索压缩文件中的特定 JSON 字符串
说明:
在 `logs.zip` 压缩包中搜索包含 `系统忙,请稍后再试' 的文件,并统计匹配次数。
命令:
zgrep -o -c '系统忙,请稍后再试' *.zip
# 注意:`zgrep` 是专门用于搜索压缩文件的工具
3. 显示关键词前后两行的上下文
说明:
在 `debug.log` 中搜索 `ConnectionTimeout` 并显示匹配行及其前后各 2 行的内容。
命令:
grep -C 2 'ConnectionTimeout' debug.log
#注意:C是大写的,如果想要看前两行用-B 2,后3行 -A 3
4. 统计时间段内字符串的出现次数
说明:
在 `access.log` 中统计 `2023-10-01 14:00` 至 `2023-10-01 15:00` 内 `GET /api/user` 的请求次数。
命令:
awk '/2023-10-01 14:[0-5][0-9]/ && /2023-10-01 15:00/ && /GET \ /api\ /user/ {count++} END {print count}' access.log
说明:结合 `awk` 处理时间范围
4.1 查询日志按时间排序,可以先用 sed 提取时间段内的行,再通过 grep 统计字符串:
sed -n '/00:00:00/,/01:55:00/p' info.log | grep -c 'GET\ \/api\/user'
四、更多高频用法
1. 递归搜索目录并显示行号
说明:
在 `/var/log` 目录及其子目录中递归搜索 `Permission denied`,并显示文件名和行号。
命令:
grep -r -n "Permission denied" /var/log
2. 精确匹配单词(避免部分匹配)
说明:
在 `config.txt` 中匹配完整的单词 `port`(避免匹配 `export` 或 `portal`)。
命令:
grep -w 'port' config.txt
五、注意事项
1. **正则表达式转义**:若搜索内容包含特殊字符(如 `.`、`*`),需用 `\` 转义。
grep "192\.168\.1\.1" access.log
2. 性能优化:大文件搜索时,可结合 `-m NUM` 限制匹配次数。
六、总结
掌握 `grep` 的常用选项和组合技巧,能大幅提升日志分析、故障排查的效率。灵活运用正则表达式和上下文控制选项,可覆盖绝大多数文本搜索场景!
推荐工具:
- 复杂正则表达式测试:[RegExr](https://regexr.com/)
- 日志分析进阶:`awk`、`sed`
希望这篇博客能帮助您快速掌握 `grep` 的核心用法!如果有其他问题,欢迎评论区交流! 🚀