grep 转了半分钟?rg 搜正则到底快在哪
【免费下载链接】ripgrepripgrep recursively searches directories for a regex pattern while respecting your gitignore项目地址: https://gitcode.com/GitHub_Trending/ri/ripgrep
打开一个三万行的老仓库,想找某个工具函数的调用点。grep -r转了半分钟还在爬目录,结果里混着 .git 和 node_modules 的噪音。装个 ripgrep(命令叫 rg),一条命令递归搜正则,被 git 忽略的文件默认就不碰——这就是它让人停不下来的原因。
rg 默认替你做什么:少配置、少踩坑
传统 grep 的默认行为很"老实":不忽略任何东西,遇到二进制文件也硬读,单线程一个文件一个文件地过。ripgrep 的默认行为是开发者视角:.gitignore、.ignore、隐藏目录这些它全看,二进制文件直接跳过,输出自动带颜色和行号。
| 传统 grep | ripgrep | |
|---|---|---|
| 忽略规则 | 手动写参数 | 默认遵守 gitignore |
| 并发 | 单线程 | 多线程遍历目录 |
| 二进制文件 | 硬读 | 自动跳过 |
| 上手成本 | 参数多 | 零配置可用 |
落点很实际:少写参数,少等,少被噪音干扰。你不用先想"要不要加 -r、要不要排除 .git",它替你想好了。
5 分钟跑通第一条 rg 搜索 🚀
装好后(apt、brew、choco 等包管理器都有 ripgrep),进任何项目目录,直接跑:
rg "fn main" -t rust白话解释:在 Rust 类型的文件里找fn main,-t rust按文件类型筛选,等价于只查 .rs 文件。结果自带行号,匹配处高亮,文件路径清清楚楚。递归是默认行为,不用加-r;行号默认显示,不用加-n。就这么简单,不用再背一堆反斜杠参数。
用顺手之后才试的三个场景
项目里有些生成目录 gitignore 没覆盖?在项目根放一个.rgignore,写法跟 gitignore 一样,全团队共享:
/target/ *.log只想看哪些文件命中,不想看行内容?rg -l "TODO"只列文件名;rg -c "TODO"给每个文件直接计数。适合先摸个大概、再决定细看哪个文件。
要把结果喂给脚本或编辑器?切 JSON 输出,机器可读,管道里怎么加工都行:
rg -j "TODO" | jq -r '.[].data.lines.text'JSON 输出的构造在 crates/printer/src/json.rs,字段结构稳定,写解析脚本不慌。
rg 快在哪:并行与跳过机制 📊
别把速度全归因于"Rust 天生快",它的加速是分层的。
并行:遍历目录不是一个人从头翻到尾,而是多个线程各领一片目录树,调度实现在 crates/ignore/src/walk.rs,用 work-stealing 队列让空闲线程去抢别人的活,核数越多越快。
跳过机制:二进制文件默认根本不打开,gitignore 里的目录连 stat 都省了。大型仓库 90% 的路径在这一层就被甩掉。
内存映射:大文件用 mmap 交给操作系统的缺页机制,不用自己分块读,内存占用可控。
字面量快速通道:像\w+foo\w+这种模式,会先抽出其中的foo快速定位候选行,再只对这几行跑完整正则。这条优化在 crates/regex/src/matcher.rs。
一句话概括:先扔掉大部分文件,再对剩下的文件做更快的匹配。
把 rg 顺手融进日常
两个今天就能做的小动作。
给 shell 加个别名,带上你每次都敲的参数:
alias rgsm='rg --smart-case --line-number'在编辑器设置里确认全局搜索后端用的是 rg(主流编辑器多数默认就是),大项目里搜索立刻快一个量级。
三个真会撞上的坑
颜色消失了:rg 只在终端直连时自动开色,输出接到管道就变纯文本。想要颜色,显式加--color=always。
搜 "a.b" 搜不出 "a.b":点、括号、问号在正则里是元字符。想按字面找,加-F关掉正则解释。
写了 ~/.ripgreprc 却不生效:rg 不自动加载用户配置,得设RIPGREP_CONFIG_PATH指向那个文件,里面每行一个参数,比如--smart-case。
收束
适合所有天天在终端里翻代码的人:项目越老、仓库越大,它省的时间越夸张。下次 clone 完仓库,先试一句rg -t py "def ",你会知道 grep 那半分钟是怎么过去的。
【免费下载链接】ripgrepripgrep recursively searches directories for a regex pattern while respecting your gitignore项目地址: https://gitcode.com/GitHub_Trending/ri/ripgrep
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考