ripgrep快速搜索

ripgrep (rg) 快速搜索指南 #

rg 是一个比 grep 快10倍的代码搜索工具,需要手动安装。

安装方法 #

# macOS
brew install ripgrep

# Ubuntu/Debian  
sudo apt install ripgrep

# CentOS/RHEL/Fedora
sudo dnf install ripgrep

# Windows
choco install ripgrep
scoop install ripgrep

# 验证安装
rg --version

基础用法 #

从简单开始 #

# 搜索关键词
rg "error"                  # 从当前目录递归搜索

# 忽略大小写
rg -i "error"              

# 指定文件
rg "TODO" file.txt         # 搜索单个文件
rg "TODO" src/             # 搜索指定目录

文件类型过滤 #

# 只搜索特定类型
rg "console" --type js      # 只在JS文件中搜索
rg "SELECT" --type sql      # 只在SQL文件中搜索
rg "TODO" --type md         # 只在Markdown中搜索

# 文件名模式
rg "api" --glob "*.go"      # 只搜索.go文件
rg "test" --glob "!*.test.js"  # 排除测试文件

显示上下文 #

rg "bug" -C 2              # 显示前后各2行
rg "error" -B 3            # 显示前3行
rg "warning" -A 3          # 显示后3行

常用选项 #

rg -l "pattern"            # 只显示文件名
rg -c "error"              # 统计匹配次数
rg --files                 # 列出所有将被搜索的文件
rg -n "TODO"               # 显示行号(默认开启)

限制结果条数 #

# 每个文件限制匹配数
rg "error" -m 5            # 每个文件最多5个匹配
rg "error" --max-count 5   # 完整写法

# 限制总行数
rg "error" | head -20      # 总共只显示前20行

# 快速预览
rg "TODO" -m 3             # 每个文件只看前3个匹配
rg -l "error" | head -5    # 只看前5个文件

搜索多个分离的字符串 #

# 同一行内的多个词
rg "error.*timeout"        # error在前,timeout在后
rg "error.*timeout|timeout.*error"  # 不限顺序

# 跨行搜索(用 -U 启用多行模式)
rg -U "import.*React[\s\S]*?useState"  # import和useState可能在不同行
rg -U "async function[\s\S]{0,200}await"  # 限制距离

# 分步搜索(适合距离很远的词)
rg -l "login" | xargs rg "password"  # 找同时包含两个词的文件

# 实用例子
rg -U "try\s*\{[\s\S]*?\}\s*catch"  # 匹配try-catch块
rg -U "class.*Component[\s\S]*?render"  # 类定义到render方法

实战场景 #

代码审查 #

# 找所有TODO
rg "TODO|FIXME|HACK"

# 查找console.log
rg "console\.(log|debug)" --type js

# 找硬编码密钥
rg "api[_-]?key.*=.*['\"]"

调试排错 #

# 搜索错误日志
rg "ERROR|FATAL" logs/ -A 3

# 追踪函数调用
rg "getUserInfo\(" --type js -C 2

# 找特定变量使用
rg "\buserState\b" --type tsx

项目理解 #

# 统计使用的React Hooks
rg "^import.*use[A-Z]" --type tsx -o | sort | uniq -c

# 找所有API路由
rg "router\.(get|post|put|delete)" --type js

# 查看项目结构
rg --files | head -20

与 grep 对比 #

写法差异 #

# 递归搜索
grep -r "error" .          # grep需要 -r
rg "error"                 # rg默认递归

# 搜索JS文件
grep -r "TODO" --include="*.js" .    # grep复杂
rg "TODO" --type js                   # rg简洁

# 排除目录
grep -r "api" --exclude-dir=node_modules .   # grep手动排除
rg "api"                                      # rg自动忽略

核心区别 #

特性greprg
速度基准快10倍+
默认递归
显示行号需要 -n默认开启
.gitignore不理解自动遵守
语法高亮
二进制文件会搜索自动跳过

使用建议 #

  • 用 rg:代码搜索、大型项目、需要性能
  • 用 grep:系统日志、管道过滤、服务器运维

高级技巧 #

# 正则表达式
rg "func\s+\w+\(" --type go     # Go函数定义
rg "^import.*from" --type js    # JS导入语句

# 多行匹配
rg -U "class.*\{[\s\S]*?\}"     # 匹配整个类定义

# 搜索隐藏文件
rg "config" --hidden

# 包括.gitignore忽略的文件
rg "password" --no-ignore

# 替换预览(不实际替换)
rg "old" --replace "new"

记住这5个 #

  1. rg "keyword" - 基础搜索
  2. rg -i "keyword" - 忽略大小写
  3. rg "keyword" --type js - 指定文件类型
  4. rg "keyword" -C 2 - 显示上下文
  5. rg -l "keyword" - 只显示文件名

掌握这5个命令,覆盖90%的使用场景。