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

说真的,前阵子看大家聊git神器、本地代码搭子什么的,我一直没吭声,有个更朴素的快乐舍不得说——把grep换成ripgrep之后,整个人都清净了。

搜代码最烦的不是找不到,是找到一堆没用的。node_modules、编译产物、二进制文件哗哗往上冒,眼睛看花。rg默认遵守.gitignore,二进制直接跳过,搜出来干干净净,不吵,像有人先帮你把垃圾扫了再让你找东西。

速度更离谱。以前grep个大仓库,去泡杯茶回来还在转;rg那套Rust正则引擎,上百万行基本秒出,我第一次跑完愣了一下,以为它没动。
好吧好吧
最香的是零成本迁移。参数跟grep几乎一样,-r、-n、-i直接复用,老脚本复制粘贴就能跑。我这种懒人最吃这套,不学新东西白捡性能,上哪说理去。没试过的装一个玩玩,回不回得去看你自己的造化。

maple__dog
[链接]

我前阵子也是被node_modules烦得不行,看了你这篇才去装了rg试了试,默认遵守.gitignore这点真的太舒服了。不过有个小情况想跟你聊——有时候我反而想钻进依赖里找某个包的真凶报错,得加 --no-ignore 才行,头回用还愣了神。但日常来说,先替你把垃圾扫干净再让你找东西,这种体贴最戳我。零成本迁移也是,老脚本一行不改直接跑,不学新东西白捡性能,嗯嗯,你说的这种朴素快乐我完全懂。

feynman1
[链接]

楼主把rg快归功于Rust正则引擎,这点值得商榷。我实际用下来,速度优势大半来自两件事:目录遍历多线程并行,以及对.gitignore和二进制文件的预剪枝——匹配之前它先把node_modules这类目录跳过了,grep却要老老实实逐个读。也就是说,rg省的主要是"读无用文件"的时间,不全是匹配本身。
严格来说其实
我做过个粗糙对比:同一个前端大仓(约80万行,不含node_modules),rg搜一个函数名零点几秒,grep -r得等好几秒;但用rg --no-ignore强制把全部目录纳入,差距立刻缩到两倍以内。所以"换rg回不去"我完全同意,只是原因得说准。

你那仓大概多大体量?小项目的话体感未必这么夸张。

stack29
[链接]

零成本迁移这话得打点折扣。grep -r默认会翻隐藏目录和符号链接,rg两个都不碰。老脚本要是靠它去扫特定路径,换完不会报错,只是静默漏结果,真到出问题那会儿才恶心。想全扫用 -uuu(每加一个u放开一层忽略)。另外没git的目录丢个 .ignore 文件,效果跟 .gitignore 一样,这点比grep省事多了。

theorem_bee
[链接]

这篇里唯一让我犹豫的是"零成本迁移"那句。-n 和 -i 确实能直接复用,但 -r 其实是个反向陷阱。

GNU grep 里 -r 是 --recursive,老脚本里常见 grep -r "foo" src/。到了 rg,-r 的意思是 --replace,干的是替换匹配的活。你要是把脚本里 grep 直接换成 rg 还留着 -r,它不会报错,只是行为整个歪掉,搜不出你想要的。好在 rg 默认就递归,正确做法是把 -r 直接删掉,而不是保留。所以准确说不是"参数几乎一样",而是"大部分一致,但 -r 语义反转,而且递归这个动作在 rg 里本来就不该显式写"。

速度那块"Rust 正则引擎"也说得偏单薄。rg 快,引擎只是一部分:并行遍历目录、用 mmap 读文件、再加上 .gitignore 过滤把 node_modules 这种在入口就排除掉,这几件事合起来才是体感来源。反过来说,你开 -P 切到 PCRE2 引擎,反而会因为 backtracking 变慢。所以"换引擎就快"是个简化,真正快的是整条 pipeline 的设计取向。

话说回来,你说的"清净"我完全同意,而且我觉得那才是核心卖点,不是速度。默认尊重 .gitignore,本质是替你做了"哪些文件算数"的判断,把噪声在源头砍掉。这个默认值(default)的设计,比纯性能数字更影响日常心情。

你现在用的是哪个版本?我记得早几个 release 对 binary 的跳过策略还调过,想确认下你那边的默认行为是不是就完全不碰二进制了。

logic90
[链接]

有个小地方得较个真:你说 "-r 直接复用"其实不太准。grep 里 -r 是递归,但 rg 的 -r 是 --replace,意思完全两样。好在 rg 默认就递归,老脚本里写 grep -r 的那段,把 -r 删掉就能直接跑。-n 和 -i 倒是一模一样,这点没瞎说。嗯

速度那块,秒出也不全是"Rust 正则引擎"的功劳,rg 还靠并行遍历目录、跳过 .gitignore 和隐藏文件省掉大量 IO,正则只是其中一环。你那个泡茶对比很真实,我当初也被这反差惊到了。

penguin__us
[链接]

头回跑rg我也傻了,空屏半天以为它崩了,一低头结果早躺那了,现在让我换回grep我是真不干哈哈

tesla_q
[链接]

我前年从ag切到rg,你说的“有人先帮你扫了地”那种感觉很准。不过零成本迁移这点得补一句:rg默认就递归,grep -r里的-r其实多余;真正会翻车的是正则语义——grep默认BRE、加-E才变ERE,rg那套引擎既不认-P,也不支持回溯引用和零宽断言,老脚本里用过grep -P的,粘过来多半得改。

gitignore清净是真清净,可哪天想翻node_modules里某个包,rg默认也藏了,得加–no-ignore。不算缺点,心里有数就行。

我是回不去了,主要是懒(

dear2006
[链接]

前阵子我也是被版上安利了rg,装完顺手敲了个rg -n就出结果,确实一点没费劲就习惯过来了。你夸的那个默认遵守.gitignore最戳我——以前grep大项目,node_modules里那些东西刷刷往上冒,看着真心烦。
理解的
不过有回我想翻.git目录里头的某个配置,rg默认不搜隐藏目录,愣是没找着,后来才晓得要补个–hidden。这算个小坑,懒人踩到别慌。另外-t按文件类型筛也挺香,比如rg ~

sweet2006
[链接]

楼主说的’以为它没动’我太有画面了。我头回用rg搜仓库也是,回车一敲结果啪就出来了,愣是以为卡了,又敲了一遍才信它是真快。

不过默认跳过那些目录这件事,我倒有一回吃过小亏,想确认node_modules里某个依赖版本装对没,rg一声不响便给我跳过去了,还得补个–no-ignore才翻出来。转念一想,这种’被它好心拦一下’的概率,比起从前被垃圾刷屏、眼睛看花,实在算不得什么罢。

不学新东西便白捡性能,我是真服气。装一个成本近乎为零,试不试得去,就看各位造化了

oldschool
[链接]

我年轻的时候还用grep -r硬搜,node_modules那堆玩意儿能把人逼疯。rg是省心。不过有回我把grep

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