grep -r 是 Linux/Unix 中用于 递归搜索文件内容 的强大命令,它会遍历指定目录及其所有子目录中的文件,查找匹配的文本模式。尤其适合:
- 日志分析(如排查错误)。
- 代码审计(如查找敏感信息)。
- 配置文件检查(如参数定位)。
以下是详细解析和实用案例:
一、命令语法
grep [选项] -r "搜索模式" [目录或文件]
-r(或--recursive):递归搜索子目录。-R:同-r,但会跟随符号链接(默认不跟随)。- 搜索模式:支持正则表达式(如
"error[0-9]")。
二、核心功能
- 递归搜索:自动遍历目录树。
- 模式匹配:支持基础正则表达式(BRE)。
- 多文件处理:可同时搜索多种文件类型。
三、常用搭配选项
| 选项 | 作用 |
|---|---|
-i | 忽略大小写(如 -i "error" 匹配 Error、ERROR)。 |
-n | 显示匹配行的行号。 |
-l | 仅显示包含匹配项的文件名(不显示具体内容)。 |
-v | 反向匹配(显示不包含模式的行)。 |
-w | 全词匹配(如 -w "word" 不匹配 password)。 |
--include | 指定文件类型(如 --include="*.py")。 |
--exclude | 排除文件类型(如 --exclude="*.log")。 |
--exclude-dir | 排除目录(如 --exclude-dir="tmp")。 |
-A NUM | 显示匹配行及其后 NUM 行(After)。 |
-B NUM | 显示匹配行及其前 NUM 行(Before)。 |
-C NUM | 显示匹配行及其前后各 NUM 行(Context)。 |
四、实用案例
1. 基础递归搜索
# 搜索当前目录及子目录中所有文件的 "ERROR" 关键词
grep -r "ERROR" .
输出格式:
./logs/app.log:2023-10-01 10:00:23 ERROR: Connection failed.
./src/utils.py:# TODO: Handle ERROR 404
2. 忽略大小写 + 显示行号
# 搜索所有 Python 文件中的 "import"(不区分大小写)并显示行号
grep -rin "import" --include="*.py" .
输出示例:
./src/main.py:3:import os
./src/main.py:5:from utils import logger
3. 仅列出文件名(不显示内容)
# 找出所有包含 "password" 的配置文件(仅显示文件名)
grep -rl "password" /etc/ --include="*.conf"
输出示例:
/etc/mysql/my.cnf
/etc/nginx/nginx.conf
4. 排除特定目录
# 搜索代码中的 "TODO",但排除 node_modules 和 .git 目录
grep -r "TODO" --exclude-dir="node_modules" --exclude-dir=".git" .
5. 全词匹配
# 精确匹配单词 "port"(不匹配 "export" 或 "portal")
grep -rw "port" /etc/nginx/
6. 多模式搜索
# 搜索 "error" 或 "warning"(需转义管道符)
grep -r -E "error|warning" /var/log/
或使用 -e 指定多个模式:
grep -r -e "error" -e "warning" /var/log/
7. 显示上下文(调试日志)
# 搜索 "crash" 并显示前后 2 行(上下文)
grep -r -C 2 "crash" /var/log/app/
输出示例:
2023-10-01 12:00:01 INFO: Starting process...
2023-10-01 12:00:05 ERROR: Null pointer exception!
2023-10-01 12:00:05 CRASH: Process terminated.
2023-10-01 12:00:06 WARN: Attempting to restart...
五、高级技巧
1. 搜索压缩文件
# 递归搜索 .gz 文件中的内容(需 zgrep)
find /var/log/ -name "*.gz" -exec zgrep "error" {} \;
2. 统计匹配次数
# 统计所有 Java 文件中 "public" 出现的总次数
grep -ro "public" --include="*.java" . | wc -l
3. 高亮显示结果
grep -r --color=auto "TODO" .
六、注意事项
- 权限问题:
- 若目录无读取权限,会报
Permission denied。可使用sudo(需谨慎)。
- 若目录无读取权限,会报
- 二进制文件:
- 默认会搜索二进制文件(可能输出乱码),建议加
-I忽略二进制文件。
- 默认会搜索二进制文件(可能输出乱码),建议加
- 性能优化:
- 大目录搜索时,用
--include/--exclude缩小范围。
- 大目录搜索时,用
2万+

被折叠的 条评论
为什么被折叠?



