简介
ripgrep(命令名 rg)是一个面向行的搜索工具,能够递归搜索当前目录中匹配正则表达式的内容。它默认遵循 .gitignore 规则,速度极快,通常比 GNU grep、ack、ag 等工具快很多。
安装
# macOS
brew install ripgrep
# Ubuntu/Debian
sudo apt install ripgrep
# Cargo
cargo install ripgrep
为什么比 grep 快
- 自动尊重
.gitignore: 在 Git 仓库中搜索时,自动跳过node_modules/、dist/、build/等被忽略的目录,避免在海量无关文件中浪费时间。这是 ripgrep 比传统grep -r快得多的关键原因之一。如需搜索被忽略的文件,可加--no-ignore - 智能过滤: 默认跳过隐藏文件和二进制文件,搜索范围更精准
- 内存映射 + 并行搜索: 利用 Rust 的零开销抽象、内存映射 I/O 和多线程并行遍历目录与文件
- 高效正则引擎: 使用 Rust 的
regex库,基于有限自动机实现,避免回溯带来的性能退化
核心功能
- 极速搜索: 通常比 GNU grep、ack、ag (the_silver_searcher) 快 2-10 倍
- 默认智能: 自动忽略
.gitignore中的文件、隐藏文件和二进制文件 - Unicode 支持: 完整的 Unicode 正则表达式支持
- 压缩文件搜索: 支持搜索 gzip、bzip2、xz、lzma 等压缩文件
- 多行搜索: 通过
-U支持跨行匹配模式
常用命令
# 基本搜索
rg "pattern"
# 搜索特定文件类型
rg "pattern" -t py
# 显示上下文行
rg "pattern" -C 3
# 仅显示文件名
rg "pattern" -l
# 正则搜索
rg "fn\s+\w+\(" -t rust
# 替换内容(预览)
rg "old_name" --replace "new_name"
典型场景
场景一:在大型代码库中快速查找函数定义
在 node_modules 满天飞的前端项目里,rg 自动跳过 .gitignore 中的目录:
# 查找 Python 文件中的函数定义
rg "^def " -t py -n
# 查找 TypeScript 中的接口定义(含上下文)
rg "^export interface" -t ts -C 2
# 查找所有 TODO / FIXME
rg "TODO|FIXME|HACK" --glob "!node_modules"
场景二:替代 grep 做日志分析
# 在压缩日志文件中搜索(无需解压)
rg "ERROR" logs/*.gz -z
# 搜索 access log 中的特定 IP,显示时间窗口
rg "192\.168\.1\.100" /var/log/nginx/access.log -C 2
# 统计各级别日志出现次数
rg "(ERROR|WARN|INFO)" app.log -o | sort | uniq -c | sort -rn
场景三:配合 fzf 实现交互式代码搜索
# 在项目中实时模糊搜索代码内容
rg_fzf() {
rg --color=always --line-number --no-heading "$1" \
| fzf --ansi \
--delimiter : \
--preview 'bat --color=always {1} --highlight-line {2}' \
--preview-window '~3:+{2}+3/2'
}
# 调用:rg_fzf "function name"
场景四:批量替换(预览模式)
rg 本身不做替换,但可以生成替换命令预览:
# 预览所有要替换的位置
rg "old_api_name" --replace "new_api_name"
# 配合 sd 执行实际替换
rg -l "old_api_name" | xargs sd "old_api_name" "new_api_name"
推荐搭配
- fzf — 与 fzf 集成实现交互式搜索
- bat — 搜索结果高亮查看