ripgrep 完全指南:比 grep 快 100 倍的命令行搜索利器

0 阅读4分钟

image.png

工欲善其事,必先利其器。在代码搜索领域,ripgrep (rg) 就是这样一把利器。

什么是 ripgrep

ripgrep (简称 rg) 是一个命令行搜索工具,用于在文件系统中递归搜索正则表达式。它由 BurntSushi (Andrew Gallant) 开发,以速度极快和尊重 .gitignore 而闻名。

核心优势

  • 极速搜索:使用 Rust 编写,多线程并行搜索,比 grep 快 10-100 倍
  • 智能过滤:默认尊重 .gitignore.ignore 等文件,自动排除无关文件
  • 强大正则:支持 PCRE2 正则表达式语法
  • 人性化工学:输出高亮、自动递归、丰富的搜索模式

安装方法

macOS

# 使用 Homebrew
brew install ripgrep

Linux

# Debian/Ubuntu
sudo apt install ripgrep

# Arch Linux
sudo pacman -S ripgrep

# Fedora
sudo dnf install ripgrep

Windows

# 使用 Scoop
scoop install ripgrep

# 使用 Chocolatey
choco install ripgrep

其他方式

# 使用 cargo(Rust 包管理器)
cargo install ripgrep

# 预编译二进制文件
# 访问 https://github.com/BurntSushi/ripgrep/releases

基本用法

最简单的搜索

# 在当前目录及其子目录中搜索 "function"
rg function

# 搜索特定文件
rg function src/main.js

# 搜索特定目录
rg function src/

常用选项

# -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

正则表达式

# 基本正则
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"

高级技巧

文件类型过滤

# 只在特定文件类型中搜索
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

搜索替换

# 仅替换,不修改原文件(输出到终端)
rg function --replace method

# 只显示替换后的内容
rg function --replace method --only-matching

上下文控制

# 显示前后 2 行
rg -C 2 function

# 只显示文件名和匹配内容(无行号)
rg --no-heading --no-line-number function

# 显示每个匹配的文件名
rg --with-filename function

颜色和格式

# 禁用颜色
rg --color never function

# 强制颜色(适用于管道)
rg --color always function | less -R

# 自定义颜色
rg --colors "match:fg:red" function

实战案例

查找函数定义

# JavaScript/TypeScript 函数定义
rg "function\s+\w+" -t js
rg "const\s+\w+\s*=\s*\(" -t js

# Python 函数定义
rg "^def\s+\w+" -t py

查找导入语句

# JavaScript import
rg "^import\s+" -t js

# Python import
rg "^import\s+|^from\s+" -t py

查找 TODO/FIXME 注释

rg -i "TODO|FIXME|XXX|HACK"

查找调试语句

# JavaScript console.log
rg "console\.(log|debug|warn|error)" -t js

# Python print
rg "^\s*print\(" -t py

统计代码行数

# 统计所有 JavaScript 文件的总行数
rg -t js --count-matches | awk -F: '{s+=$2} END {print s}'

# 按文件统计匹配数
rg -c function | sort -t: -k2 -rn

在项目中查找特定配置

# 查找所有 package.json 中的依赖版本
rg "\"dependencies\"\s*:" -g "package.json" -A 10

# 查找所有环境变量使用
rg "process\.env" -t js

与其他工具组合

# 与 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 文件来排除不需要搜索的目录:

# .rgignore
node_modules/
dist/
build/
*.min.js
*.min.css
coverage/
.vscode/
.idea/

利用 git 仓库信息

ripgrep 默认会尊重 .gitignore,这样可以避免搜索不必要的文件:

# 强制搜索被 gitignore 的文件
rg --no-ignore-vcs function

并行搜索

ripgrep 自动使用多线程,但你可以通过 --threads 控制:

# 使用 4 个线程
rg --threads 4 function

ripgrep vs grep vs ag

特性ripgrepgrepag (The Silver Searcher)
速度⚡⚡⚡⚡⚡
.gitignore 支持
PCRE2 正则部分支持部分支持
多线程
Windows 原生支持

高级配置

别名设置

.zshrc.bashrc 中添加别名:

# 常用别名
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 文件

环境变量

# RIPGREP_CONFIG_PATH 指定配置文件路径
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"

# .ripgreprc 示例
--smart-case
--hidden
--glob=!*.min.js
--glob=!node_modules/

与编辑器集成

Vim/Neovim

" 在 Vim 中使用 ripgrep
command! -nargs=+ Rg execute 'Grepper! -tool rg -query <q-args>'

" 或使用 fzf.vim
:Rg function

VS Code

VS Code 内置搜索使用 ripgrep(如果已安装),无需额外配置。

常见问题

Q: 如何搜索包含特殊字符的字符串?

# 使用 -F 进行固定字符串搜索(禁用正则)
rg -F "C++"

# 或者转义特殊字符
rg "C\+\+"

Q: 如何在压缩文件中搜索?

# ripgrep 不直接支持,但可以结合其他工具
zgrep "pattern" file.gz

Q: 如何搜索二进制文件?

# ripgrep 默认跳过二进制文件,使用 --text 强制搜索
rg --text "pattern" binary_file

Q: 如何获取所有匹配的行号?

# 使用 --line-number
rg --line-number "pattern"

总结

ripgrep 是现代开发者的必备工具之一,它:

  • 速度快:多线程并行,智能缓存
  • 省时间:自动排除无关文件,减少噪音
  • 易使用:人性化的默认设置,清晰的输出
  • 功能强:强大的正则支持,丰富的选项

一旦你开始使用 ripgrep,就很难回到传统的 grep 了。它让代码搜索变得高效而愉悦。

参考资源


提示:将 rg 加入你的 muscle memory,它会是命令行工作中最常用的工具之一。记住几个常用选项(-i-l-t-C),就能覆盖 90% 的搜索场景。