
工欲善其事,必先利其器。在代码搜索领域,ripgrep (rg) 就是这样一把利器。
什么是 ripgrep
ripgrep (简称 rg) 是一个命令行搜索工具,用于在文件系统中递归搜索正则表达式。它由 BurntSushi (Andrew Gallant) 开发,以速度极快和尊重 .gitignore 而闻名。
核心优势
- 极速搜索:使用 Rust 编写,多线程并行搜索,比 grep 快 10-100 倍
- 智能过滤 :默认尊重
.gitignore、.ignore等文件,自动排除无关文件 - 强大正则:支持 PCRE2 正则表达式语法
- 人性化工学:输出高亮、自动递归、丰富的搜索模式
安装方法
macOS
bash
# 使用 Homebrew
brew install ripgrep
Linux
bash
# Debian/Ubuntu
sudo apt install ripgrep
# Arch Linux
sudo pacman -S ripgrep
# Fedora
sudo dnf install ripgrep
Windows
powershell
# 使用 Scoop
scoop install ripgrep
# 使用 Chocolatey
choco install ripgrep
其他方式
bash
# 使用 cargo(Rust 包管理器)
cargo install ripgrep
# 预编译二进制文件
# 访问 https://github.com/BurntSushi/ripgrep/releases
基本用法
最简单的搜索
bash
# 在当前目录及其子目录中搜索 "function"
rg function
# 搜索特定文件
rg function src/main.js
# 搜索特定目录
rg function src/
常用选项
bash
# -i 忽略大小写
rg -i function
# -w 全词匹配
rg -w function
# -l 只显示匹配的文件名
rg -l function
# -c 显示匹配次数
rg -c function
# -n 显示行号
rg -n function
# -C 显示上下文(前后各 N 行)
rg -C 3 function
# -B 显示前 N 行
rg -B 3 function
# -A 显示后 N 行
rg -A 3 function
正则表达式
bash
# 基本正则
rg "func.*name"
# 或操作
rg "function|class"
# 匹配数字
rg "\d{3,4}"
# 匹配邮箱
rg "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
高级技巧
文件类型过滤
bash
# 只在特定文件类型中搜索
rg -t js function # JavaScript 文件
rg -t py function # Python 文件
rg -t rs function # Rust 文件
# 排除特定文件类型
rg -T md function # 排除 Markdown 文件
# 指定扩展名
rg -g "*.js" function
rg -g "*.{js,ts}" function
# 排除特定模式
rg -g "!node_modules" function
rg -g "!*.min.js" function
搜索替换
bash
# 仅替换,不修改原文件(输出到终端)
rg function --replace method
# 只显示替换后的内容
rg function --replace method --only-matching
上下文控制
bash
# 显示前后 2 行
rg -C 2 function
# 只显示文件名和匹配内容(无行号)
rg --no-heading --no-line-number function
# 显示每个匹配的文件名
rg --with-filename function
颜色和格式
bash
# 禁用颜色
rg --color never function
# 强制颜色(适用于管道)
rg --color always function | less -R
# 自定义颜色
rg --colors "match:fg:red" function
实战案例
查找函数定义
bash
# JavaScript/TypeScript 函数定义
rg "function\s+\w+" -t js
rg "const\s+\w+\s*=\s*\(" -t js
# Python 函数定义
rg "^def\s+\w+" -t py
查找导入语句
bash
# JavaScript import
rg "^import\s+" -t js
# Python import
rg "^import\s+|^from\s+" -t py
查找 TODO/FIXME 注释
bash
rg -i "TODO|FIXME|XXX|HACK"
查找调试语句
bash
# JavaScript console.log
rg "console\.(log|debug|warn|error)" -t js
# Python print
rg "^\s*print\(" -t py
统计代码行数
bash
# 统计所有 JavaScript 文件的总行数
rg -t js --count-matches | awk -F: '{s+=$2} END {print s}'
# 按文件统计匹配数
rg -c function | sort -t: -k2 -rn
在项目中查找特定配置
bash
# 查找所有 package.json 中的依赖版本
rg "\"dependencies\"\s*:" -g "package.json" -A 10
# 查找所有环境变量使用
rg "process\.env" -t js
与其他工具组合
bash
# 与 fzf 组合(交互式搜索)
rg --files | fzf
# 与 xargs 组合(批量操作)
rg -l "console.log" -t js | xargs sed -i '' '/console.log/d'
# 与 less 组合(分页查看)
rg function | less -R
# 输出到文件
rg function > results.txt
性能优化技巧
使用 .rgignore
创建 .rgignore 文件来排除不需要搜索的目录:
text
# .rgignore
node_modules/
dist/
build/
*.min.js
*.min.css
coverage/
.vscode/
.idea/
利用 git 仓库信息
ripgrep 默认会尊重 .gitignore,这样可以避免搜索不必要的文件:
bash
# 强制搜索被 gitignore 的文件
rg --no-ignore-vcs function
并行搜索
ripgrep 自动使用多线程,但你可以通过 --threads 控制:
bash
# 使用 4 个线程
rg --threads 4 function
ripgrep vs grep vs ag
| 特性 | ripgrep | grep | ag (The Silver Searcher) |
|---|---|---|---|
| 速度 | ⚡⚡⚡ | ⚡ | ⚡⚡ |
| .gitignore 支持 | ✅ | ❌ | ✅ |
| PCRE2 正则 | ✅ | 部分支持 | 部分支持 |
| 多线程 | ✅ | ❌ | ✅ |
| Windows 原生支持 | ✅ | ✅ | ❌ |
高级配置
别名设置
在 .zshrc 或 .bashrc 中添加别名:
bash
# 常用别名
alias rg='rg --smart-case'
alias rgi='rg -i' # 忽略大小写
alias rgl='rg -l' # 只显示文件名
alias rgn='rg -n' # 显示行号
alias rgc='rg -C 3' # 显示上下文
alias rgt='rg -t js' # 搜索 JS 文件
环境变量
bash
# RIPGREP_CONFIG_PATH 指定配置文件路径
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"
# .ripgreprc 示例
--smart-case
--hidden
--glob=!*.min.js
--glob=!node_modules/
与编辑器集成
Vim/Neovim
vim
" 在 Vim 中使用 ripgrep
command! -nargs=+ Rg execute 'Grepper! -tool rg -query <q-args>'
" 或使用 fzf.vim
:Rg function
VS Code
VS Code 内置搜索使用 ripgrep(如果已安装),无需额外配置。
常见问题
Q: 如何搜索包含特殊字符的字符串?
bash
# 使用 -F 进行固定字符串搜索(禁用正则)
rg -F "C++"
# 或者转义特殊字符
rg "C\+\+"
Q: 如何在压缩文件中搜索?
bash
# ripgrep 不直接支持,但可以结合其他工具
zgrep "pattern" file.gz
Q: 如何搜索二进制文件?
bash
# ripgrep 默认跳过二进制文件,使用 --text 强制搜索
rg --text "pattern" binary_file
Q: 如何获取所有匹配的行号?
bash
# 使用 --line-number
rg --line-number "pattern"
总结
ripgrep 是现代开发者的必备工具之一,它:
- 速度快:多线程并行,智能缓存
- 省时间:自动排除无关文件,减少噪音
- 易使用:人性化的默认设置,清晰的输出
- 功能强:强大的正则支持,丰富的选项
一旦你开始使用 ripgrep,就很难回到传统的 grep 了。它让代码搜索变得高效而愉悦。
参考资源
提示 :将
rg加入你的 muscle memory,它会是命令行工作中最常用的工具之一。记住几个常用选项(-i、-l、-t、-C),就能覆盖 90% 的搜索场景。