ripgrep 高性能文本搜索工具使用指南
# 📖 简介
ripgrep(简称 rg)是一个高性能的文本搜索工具,专为速度和易用性而设计。它结合了 grep、ag(The Silver Searcher)的优点,并在性能上超越了它们。
# 核心特性
- ⚡ 速度极快:使用 Rust 编写,多线程并行搜索
- 🎯 智能过滤:默认忽略
.gitignore、.ignore文件中的内容 - 🔍 正则表达式:支持强大的正则表达式搜索
- 🎨 彩色输出:自动高亮匹配结果
- 📁 文件类型:内置支持数百种文件类型
- 🔄 递归搜索:默认递归搜索子目录
# 性能对比
| 工具 | 速度 | 智能过滤 | 正则支持 | 推荐度 |
|---|---|---|---|---|
| ripgrep | ⭐⭐⭐⭐⭐ | ✅ | ✅ | ⭐⭐⭐⭐⭐ |
| ag | ⭐⭐⭐⭐ | ✅ | ✅ | ⭐⭐⭐⭐ |
| grep | ⭐⭐⭐ | ❌ | ✅ | ⭐⭐⭐ |
| ack | ⭐⭐ | ✅ | ✅ | ⭐⭐ |
# 🚀 安装
# macOS
brew install ripgrep
1
# Ubuntu/Debian
sudo apt install ripgrep
1
# CentOS/RHEL
sudo yum install ripgrep
1
# 验证安装
rg --version
# 输出:ripgrep 14.1.0
1
2
2
# 📚 基础用法
# 基本语法
rg [选项] <搜索模式> [路径]
1
# 最简单的搜索
# 在当前目录递归搜索 "TODO"
rg TODO
# 在指定目录搜索
rg TODO /path/to/project
# 在指定文件搜索
rg TODO file.txt
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出示例:
src/main.rs
12: // TODO: 优化性能
45: // TODO: 添加错误处理
docs/README.md
8:## TODO
1
2
3
4
5
6
2
3
4
5
6
# 🎯 常用选项详解
# 1. 大小写敏感
# 忽略大小写(case-insensitive)
rg -i "error"
# 示例:匹配 Error、ERROR、error
rg -i error log.txt
1
2
3
4
5
2
3
4
5
# 2. 完整单词匹配
# 只匹配完整单词
rg -w "test"
# ✅ 匹配:test
# ❌ 不匹配:testing、contest
1
2
3
4
5
2
3
4
5
# 3. 反向匹配
# 显示不包含 "debug" 的行
rg -v "debug"
# 实战:查找所有非注释行(假设注释以 # 开头)
rg -v "^#" config.ini
1
2
3
4
5
2
3
4
5
# 4. 统计匹配数量
# 只显示每个文件的匹配行数
rg -c "import"
# 输出示例:
# main.py:15
# utils.py:8
# test.py:3
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5. 显示行号
# 显示匹配行的行号(默认开启)
rg -n "function"
# 不显示行号
rg -N "function"
1
2
3
4
5
2
3
4
5
# 6. 上下文显示
# 显示匹配行前后各 3 行
rg -C 3 "error"
# 只显示前 2 行
rg -B 2 "error"
# 只显示后 2 行
rg -A 2 "error"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出示例:
src/main.rs
10-def process_data():
11- try:
12: raise ValueError("error occurred") # 匹配行
13- except Exception as e:
14- print(e)
1
2
3
4
5
6
2
3
4
5
6
# 7. 限制结果数量
# 只显示前 5 个匹配
rg --max-count 5 "TODO"
# 找到 1 个结果就停止(快速检查是否存在)
rg --max-count 1 "uid"
1
2
3
4
5
2
3
4
5
# 8. 搜索隐藏文件
# 包括隐藏文件(如 .env、.gitignore)
rg --hidden "API_KEY"
# 搜索隐藏文件,但仍然遵守 .gitignore
rg --hidden "password"
1
2
3
4
5
2
3
4
5
# 9. 忽略 .gitignore
# 搜索所有文件,包括被 .gitignore 忽略的
rg --no-ignore "secret"
# 同时搜索隐藏文件和被忽略的文件
rg --hidden --no-ignore "config"
1
2
3
4
5
2
3
4
5
# 10. 只显示文件名
# 只列出包含匹配的文件名
rg -l "import"
# 输出示例:
# main.py
# utils.py
# test.py
1
2
3
4
5
6
7
2
3
4
5
6
7
# 11. 只显示匹配内容
# 只显示匹配的部分(不显示整行)
rg -o "https?://[^\s]+"
# 示例:提取所有 URL
rg -o "https?://[^\s]+" README.md
1
2
3
4
5
2
3
4
5
# 🎨 文件类型过滤
# 按文件类型搜索
# 只搜索 Python 文件
rg -t py "import"
# 只搜索 JavaScript/TypeScript 文件
rg -t js -t ts "function"
# 排除 Python 文件
rg -T py "TODO"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 查看支持的文件类型
# 列出所有支持的文件类型
rg --type-list
# 输出示例:
# py: *.py, *.pyi
# js: *.js, *.jsx, *.mjs
# rust: *.rs
# ...
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 自定义文件类型
# 添加自定义文件类型
rg --type-add 'custom:*.{foo,bar}' -t custom "pattern"
1
2
2
# 🔍 使用 glob 模式
# 基本 glob 用法
# 只搜索 .smali 文件
rg 'pattern' --glob '*.smali'
# 只搜索 src 目录下的 .java 文件
rg 'pattern' --glob 'src/**/*.java'
# 排除 test 目录
rg 'pattern' --glob '!test/**'
# 排除所有 .min.js 文件
rg 'pattern' --glob '!*.min.js'
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 多个 glob 组合
# 搜索 a、b、c 目录下的文件
rg 'pattern' --glob 'a/**' --glob 'b/**' --glob 'c/**'
# 搜索 .js 和 .ts 文件,但排除 node_modules
rg 'pattern' --glob '*.{js,ts}' --glob '!node_modules/**'
# 复杂组合:只搜索 src 下的 .java 文件,排除 test
rg 'pattern' --glob 'src/**/*.java' --glob '!src/**/test/**'
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 🎯 正则表达式搜索
# 基本正则
# 搜索以 "function" 开头的行
rg "^function"
# 搜索以 ";" 结尾的行
rg ";$"
# 搜索包含数字的行
rg "\d+"
# 搜索邮箱地址
rg "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 捕获组
# 提取版本号
rg "version:\s*(\d+\.\d+\.\d+)" -r '$1'
# 替换匹配内容(不修改文件,只显示)
rg "TODO" -r "DONE"
1
2
3
4
5
2
3
4
5
# 多行匹配
# 搜索跨行的模式(需要 -U 选项)
rg -U "function.*\{.*\}" --multiline
# 示例:匹配多行注释
rg -U "/\*.*?\*/" --multiline
1
2
3
4
5
2
3
4
5
# 📊 实战案例
# 1. 查找所有 TODO 和 FIXME
rg "(TODO|FIXME|HACK|XXX)" --color always
1
# 2. 查找未使用的导入(Python)
# 找到所有 import 语句
rg "^import|^from .* import" -t py
# 结合其他工具检查是否使用
1
2
3
4
2
3
4
# 3. 查找敏感信息
# 查找可能的密码
rg -i "password\s*=\s*['\"][^'\"]+['\"]" --hidden
# 查找 API 密钥
rg "api[_-]?key" --hidden --no-ignore
# 查找 IP 地址
rg "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4. 代码审查
# 查找 console.log(应该在生产环境移除)
rg "console\.log" -t js -t ts
# 查找硬编码的 URL
rg "https?://(?!example\.com)" -t js
# 查找 eval 使用(安全风险)
rg "\beval\(" -t js
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5. 查找大文件中的内容
# 在日志文件中查找错误
rg "ERROR|FATAL" --max-count 10 /var/log/app.log
# 查找特定时间段的日志
rg "2024-01-15.*ERROR" /var/log/app.log
1
2
3
4
5
2
3
4
5
# 6. 统计代码行数
# 统计所有 Python 文件的行数
rg --count-matches ".*" -t py | awk -F: '{sum+=$2} END {print sum}'
# 统计非空行
rg --count-matches "\S" -t py
1
2
3
4
5
2
3
4
5
# 7. 查找并替换(预览)
# 预览替换效果(不修改文件)
rg "oldFunction" -r "newFunction" -t js
# 实际替换需要配合 sed 或其他工具
rg -l "oldFunction" -t js | xargs sed -i 's/oldFunction/newFunction/g'
1
2
3
4
5
2
3
4
5
# 8. 排除特定目录
# 排除 node_modules 和 dist
rg "pattern" --glob '!node_modules/**' --glob '!dist/**'
# 排除所有测试文件
rg "pattern" --glob '!**/*test*'
1
2
3
4
5
2
3
4
5
# 9. 搜索二进制文件
# 默认跳过二进制文件,强制搜索
rg --text "pattern" binary_file
# 或使用 -a(--text 的简写)
rg -a "pattern" binary_file
1
2
3
4
5
2
3
4
5
# 10. JSON 日志分析
# 查找包含特定字段的 JSON 行
rg '"level":"error"' --json logs.json
# 提取特定字段
rg '"userId":"(\d+)"' -o -r '$1' logs.json
1
2
3
4
5
2
3
4
5
# ⚙️ 配置文件
# 创建配置文件
ripgrep 会读取 ~/.ripgreprc 或 $RIPGREP_CONFIG_PATH 指定的配置文件。
# 创建配置文件
cat > ~/.ripgreprc << 'EOF'
# 默认忽略大小写
--smart-case
# 默认显示行号
--line-number
# 默认显示上下文
--context=2
# 默认排除的目录
--glob=!node_modules/**
--glob=!.git/**
--glob=!dist/**
--glob=!build/**
# 自定义文件类型
--type-add=web:*.{html,css,js,jsx,ts,tsx}
EOF
# 设置环境变量
export RIPGREP_CONFIG_PATH=~/.ripgreprc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 🔧 高级技巧
# 1. 组合管道使用
# 查找并排序
rg "import" -t py | sort
# 查找并统计
rg "TODO" -c | awk -F: '{sum+=$2} END {print "Total TODOs:", sum}'
# 查找并去重
rg -o "https?://[^\s]+" | sort -u
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2. 与其他工具配合
# 查找文件并用 vim 打开
vim $(rg -l "TODO" -t py)
# 查找并复制到剪贴板(macOS)
rg "API_KEY" | pbcopy
# 查找并传递给 xargs
rg -l "old_function" | xargs sed -i 's/old_function/new_function/g'
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 性能优化
# 限制搜索深度
rg "pattern" --max-depth 3
# 使用更多线程(默认自动检测)
rg "pattern" --threads 8
# 禁用 mmap(某些情况下更快)
rg "pattern" --no-mmap
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4. 调试搜索
# 显示搜索的文件
rg "pattern" --debug
# 显示匹配统计
rg "pattern" --stats
1
2
3
4
5
2
3
4
5
# 📊 常用选项速查表
| 选项 | 简写 | 说明 | 示例 |
|---|---|---|---|
--ignore-case | -i | 忽略大小写 | rg -i error |
--word-regexp | -w | 完整单词匹配 | rg -w test |
--invert-match | -v | 反向匹配 | rg -v debug |
--count | -c | 统计匹配数 | rg -c import |
--line-number | -n | 显示行号 | rg -n func |
--no-line-number | -N | 不显示行号 | rg -N func |
--context | -C | 上下文行数 | rg -C 3 error |
--before-context | -B | 前文行数 | rg -B 2 error |
--after-context | -A | 后文行数 | rg -A 2 error |
--files-with-matches | -l | 只显示文件名 | rg -l TODO |
--only-matching | -o | 只显示匹配部分 | rg -o "http.*" |
--hidden | 搜索隐藏文件 | rg --hidden key | |
--no-ignore | 忽略 .gitignore | rg --no-ignore | |
--type | -t | 指定文件类型 | rg -t py import |
--type-not | -T | 排除文件类型 | rg -T js TODO |
--glob | -g | 文件名模式 | rg -g '*.java' |
--max-count | -m | 限制结果数 | rg -m 5 TODO |
--replace | -r | 替换匹配内容 | rg TODO -r DONE |
# 🆚 与其他工具对比
# ripgrep vs grep
# grep 需要递归选项
grep -r "pattern" .
# ripgrep 默认递归
rg "pattern"
# grep 需要排除目录
grep -r "pattern" --exclude-dir=node_modules .
# ripgrep 自动排除
rg "pattern" # 自动忽略 .gitignore 中的内容
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# ripgrep vs ag
# 两者用法相似,但 rg 更快
ag "pattern"
rg "pattern"
# rg 支持更多选项
rg "pattern" --stats # ag 不支持
1
2
3
4
5
6
2
3
4
5
6
# 💡 最佳实践
# 1. 使用智能大小写
# 小写模式:忽略大小写
rg "error" # 匹配 Error、ERROR、error
# 包含大写:精确匹配
rg "Error" # 只匹配 Error
1
2
3
4
5
2
3
4
5
# 2. 善用配置文件
将常用选项放入 ~/.ripgreprc,避免每次输入。
# 3. 结合 alias
# 添加到 ~/.bashrc 或 ~/.zshrc
alias rgi='rg -i' # 忽略大小写
alias rgl='rg -l' # 只显示文件名
alias rgc='rg -C 3' # 显示上下文
1
2
3
4
2
3
4
# 4. 使用 --stats 分析性能
rg "pattern" --stats
# 输出:
# 15 matches
# 5 files searched
# 0.05 seconds
1
2
3
4
5
2
3
4
5
# 🔗 参考资源
# 🎯 总结
ripgrep 的核心优势:
- ⚡ 速度快:比 grep、ag 快数倍
- 🎯 智能:自动忽略不必要的文件
- 🔍 强大:支持复杂的正则表达式
- 🎨 友好:彩色输出,易于阅读
- 🔧 灵活:丰富的选项和配置
推荐使用场景:
- ✅ 代码搜索和审查
- ✅ 日志分析
- ✅ 配置文件查找
- ✅ 文档搜索
- ✅ 大型项目快速定位
ripgrep 是现代开发者必备的命令行工具之一!🚀
上次更新: 2025/10/19, 17:40:23