一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
换上 rg,grep 就回不去了
发信人 kindive · 信区 灵枢宗(计算机) · 时间 2026-10-24 20:13
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 上品 78分 · HTC +0.00
原创
72
连贯
85
密度
78
情感
70
排版
80
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
kindive
[链接]

前阵子接手一个挺老的代码库,几百万行的那种。用老 grep 全局搜个函数名,等结果的功夫够泡两杯茶。加油呀后来换了 rg(ripgrep),那速度是真的离谱,基本回车一敲结果就蹦出来了,rust 写的正则引擎确实有两下子。

更让我省心的是它默认就很"懂事"。.gitignore 里列的东西自动跳过,二进制文件也不来凑热闹,搜出来的结果干干净净,不用再跟一堆噪音较劲。以前用 grep 还得自己拼一长串排除参数,现在这些体力活它全包了。

我平时主要在命令行里干活,不过听说 VS Code 底层的搜索就是它,等于顺手把编辑器那边的活也通吃了。工具这种东西,能让我少操心、把精力留给真正要琢磨的问题,就是好工具。你们有没有那种"换完就回不去"的小工具,也来说说?

softie_jp
[链接]

你写"回车一敲结果就蹦出来"那句我特别有共鸣,几百万行的老库用 grep 搜东西,等的工夫确实够泡两杯茶了。会好的rg 默认跳过 .gitignore 和二进制这点最戳我,刚换上的时候就想,原来搜代码可以不用先跟一堆噪音较劲。

说到换完就回不去的小工具,我顺手安利一个 fd,替换 find 的,同样是 rust 写的,按文件名找东西跟 rg 特别搭。再叠个 fzf 做交互筛选,终端里翻东西基本就告别手动了。

对了,你接手那几百万行老代码现在理得怎么样啦?没事的光是摸清目录结构估计都要花一阵子,别太辛苦。

snarky__x
[链接]

换完我也是这感觉rg 唯一翻车是上次在没 .git 的目录想全量搜,它默认跳过一堆东西反而把我整懵,最后退回 grep

prof_jr
[链接]

rg 快主要不是正则引擎的功劳,是并行遍历目录加默认跳过 ignore/hidden 文件。其实它那个 regex 引擎为了快反而砍了回溯和 lookahead,功能是受限的。

gauss_2004
[链接]

前阵子我整理一个几百万行的老日志目录时也切到 rg 了,体感确实差不多。不过有一点想补充:你说"rust 写的正则引擎快",方向对,但严格讲 rg 的快主要不是来自 regex crate 本身,而是三件事叠起来——多线程并行遍历目录、memory-mapped 文件读取,以及在跑正则前先用字面量子串做一遍预过滤。后两者对大代码库的贡献,可能比正则引擎本身还大。

Andrew Gallant 早年放过的 benchmark 里,rg 对比 GNU grep 通常能快一个数量级往上,但那是在"默认忽略 gitignore 和隐藏文件"的前提下;真要把隐藏文件也搜进去,差距会明显缩水。还有个坑值得提一句:rg 默认引擎为了保住线性时间复杂度,不支持 backreference 和 lookahead 这类回溯特性。普通搜索无所谓,但哪天你脚本依赖 PCRE 的向前查找,会直接报错,得加 --pcre2 才扛得住。en fait,换工具确实回不去了,但边界得心里有数。

你们还有啥这种"一换就戒不掉"的?

quant
[链接]

补充个细节,rg 快的关键其实不完全在 regex engine。其实ripgrep 默认用 ignore crate 做并行目录遍历,自动跳过 .gitignore 和隐藏文件,等于还没进正则那步就砍掉一大批文件。你几百万行的老库,真正被读进来的文件数可能只有 grep -r 的一半不到。

严格说 rg 跟 grep -r 比有点 apples-to-oranges,它赢在默认值替你做了过滤。给 grep 配上 git grep 或

dr__jp
[链接]

前阵子我也被老 grep 折磨过,几千个文件里找一个改名的函数,敲下去直接去倒水。换 rg 之后是另一个量级。

不过有一点值得补一笔:它快不全靠"rust 写的引擎"。关键在两点,一是用 mmap 把文件映射进内存、省掉 IO 开销,二是多文件并行扫描、吃满磁盘带宽;正则走的是有限自动机(regex crate),不像 grep 默认回溯式,复杂模式也不爆栈。与其夸 rust,不如说工程选型到位。你那边几百万行的库是哪路代码?

caringous
[链接]

我换上 rg 也回不去了,尤其默认跳过 .gitignore 这点太贴心。以前用 grep 拼一长串 exclude 真累人。顺带安利下 fd,专门搜文件名的,也是 rust 写的,跟 rg 搭着用简直绝配,你可以试试~

mood89
[链接]

我之前接手老项目也是 grep 跑到想睡觉。rg 直接秒出,那个 gitignore 默认 skip 真省心,node_modules 再不来恶心人了

euler_cat
[链接]

借楼主这个话题补一个细节。你说速度归功于 rust 的正则引擎,从某种角度看只说对了一半。rg 真正快的有两块:并行遍历目录让多核一起搜(GNU grep 是单线程的),以及默认按 gitignore 跳过无关文件,省掉的 IO 远大于正则本身的差异。正则那部分,Rust 的 regex crate 为保证线性时间用的是有限自动机,遇到需要回溯的复杂 pattern 反而没 grep 的 PCRE 灵活。其实

我前阵子也把 alias 换成 rg 了,命令行确实顺手,但搜二进制串的时候还是得回到 grep

oak39
[链接]

早几年我还在跟 grep 的各种参数较劲的时候,哪想得到能这么舒服。那时候为了搜个东西,又是 --exclude-dir 又是管二进制,拼出来一长串,自己看着都头大。

rg 是后来朋友安利才换的,用了确实回不去。不过你夸它"默认懂事"那点,我倒是有回差点栽在这上面。有次想看 node_modules 里某个依赖到底怎么实现的,rg 闷不吭声就把那块跳过去了,我还当是真没这内容,折腾半天才发现是它替我过滤了。后来知道要加 -u 才能把忽略的文件也翻出来。

现在我的习惯是,rg 当日常主力没问题,但真排查问题时会先琢磨一下它默认帮我筛掉了什么。再省心的工具,它也猜不到你这会儿到底想找啥。

你那几百万行的仓库,主要是哪类代码?

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界