rg 是什么
rg 是 ripgrep 的可执行文件,用 Rust 写的递归搜索工具。它把「在目录树里找内容」当作默认场景:自动并行遍历、默认遵守 .gitignore 与 .ignore、跳过隐藏文件与含 NUL 字节的二进制文件。比 grep -r 快的主要来源是并行扫描与更快的正则引擎,其次是对无关路径的提前剪枝。它默认按文件分组输出并高亮匹配,人读友好但对脚本不友好,管道场景要显式关掉这些美化。正则语法默认是 Rust regex,并非 POSIX 正则,写复杂模式前要意识到这个差异。
基本信息
| 适用平台 | Linux/macOS/Windows 均有单文件二进制;发行版包名 ripgrep,命令名 rg,最小化镜像可能需手动安装 |
|---|---|
| 命令语法 | rg [选项] 模式 [路径...] |
| 常用选项 | -n 显示行号 -i 忽略大小写 -F 固定串 -w 全词匹配 -l 只列文件名 -c 统计每文件匹配数 -g 通配过滤 -t 按文件类型 -C 上下文 |
| 搜索范围控制 | --hidden 搜隐藏文件 --no-ignore 忽略 .gitignore -u/-uu 逐级放宽,--max-depth 限制层级 |
| 与 grep 的差异 | 默认递归、默认跳过被忽略与隐藏文件、默认跳过二进制,这些默认值都与 grep -r 不同 |
典型使用场景
- 代码检索:在大仓库里找函数定义、配置项引用、TODO 标记
- 改域名/换品牌:全站搜旧域名,先 rg -l 列出待改文件再批量替换
- 站点目录排查:在 /www/wwwroot 下找某段被注入的代码片段
- 深挖被忽略文件:加 --hidden 搜 .env、部署脚本等默认跳过的文件
- 统计类排查:rg -c 看某个错误字符串在各文件出现次数,快速定位重灾区
常用示例
常用示例
rg -n 'TODO|FIXME' src/ # 带行号递归搜索
rg -F 'a.b(c' file.txt # 固定字符串,关闭正则
rg -l 'old_domain' /www/wwwroot --glob '!*.min.js' # 只列文件并排除压缩产物
rg -t py -C2 'def main' # 只搜 python 类型,带 2 行上下文
rg --hidden --no-ignore 'API_KEY' . # 连被忽略的隐藏文件一起搜
rg -c 'ERROR' /var/log/app/*.log # 每个文件的匹配行数
rg --no-heading --color never 'v1' src/ # 脚本里要稳定输出为什么比 grep -r 快
| 机制 | 说明 | 实际影响 |
|---|---|---|
| 并行遍历 | 多线程同时扫描目录与文件 | 多核机器上速度随核数提升,grep -r 是单线程 |
| 忽略规则剪枝 | 默认不进入 .gitignore/.ignore 命中的路径 | node_modules、.git 这类大目录被整体跳过 |
| 二进制检测 | 读到 NUL 字节即判定二进制并跳过 | 避免在大对象文件上白读几十 MB |
| 字面量优化 | 模式不含元字符时走优化过的固定串搜索 | rg -F 通常是最快的一档 |
| 读取策略 | 按文件大小在顺序读与内存映射间取舍 | 大文件上系统调用开销更少 |
ripgrep 默认的 Rust 正则不支持反向引用与前后瞻断言,需要时加 -P 启用 PCRE2 引擎,代价是放弃部分性能优化并可能出现回溯开销。
rg 会跳过被忽略与隐藏的文件,这是它的优点也是排查陷阱:搜不到不等于不存在,怀疑漏搜时先加 --hidden --no-ignore 复核一遍再下结论。