$ terminals _

ripgrep

面向行的搜索工具,递归搜索目录中的正则表达式模式,速度极快

🌐 官网 GitHub brew install ripgrep

简介

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 — 搜索结果高亮查看