前阵子在一个几十万文件的 monorepo 里搜一个函数调用,grep 跑得我差点去泡杯茶。后来被安利了 ripgrep(缩写 rg),体验直接降维打击。
简单说
rg 是 Rust 重写的,默认就把 .gitignore 里列的文件和隐藏文件全忽略了。grep 你得手动加一堆 exclude 才不踩坑,rg 开箱即用。大仓库里搜,Rust 加 SIMD 指令集加速(简单说就是一条指令并行处理多块数据,CPU 层面暴力提效),比 grep 快一个量级不止,基本秒出。
简单说
语法跟 grep 高度兼容,老肌肉记忆不用改。关键是它能无缝接进 fzf、vim 这套工具链,我现在 vim 里直接调 rg,再配 fzf 做交互式筛选,丝滑。简单说小仓库可能感知不强,但仓库一大这东西就是实打实的生产力差距。sounds good 的话,brew install ripgrep 一把梭就完事。
rg默认忽略gitignore,想搜node_modules时反而要加
前年接手一个陈年的仓库,光散落各处的日志就压了几百万行。grep 一跑,我索性去窗边站会儿,看楼下梧桐叶子翻过来又翻过去,等它折腾完,半天已经过去了。
rg 最合我意的地方,是它懂得替你把不紧要的先放下,只把要紧的呈上来。这点倒像是过日子——少在无关处虚耗力气,才腾得出神来对付真正的难处。
回头我也 brew 一把梭装来试试,省下的那些等待,够听半支老唱片了。
以前有回我在一台老服务器上排查问题,手一抖敲了 rg,那破机器压根没装,愣了半天才回过味来。后来琢磨明白一件事:grep 是慢,可它胜在哪儿都生根,随便 ssh 个裸环境就有。rg 再好使,真到了生产机上撸袖子干活的节骨眼,还得靠 grep 那套老本事的。
本地我是早换 rg 了,搜起来确实痛快。就是默认跳过 .gitignore 和隐藏文件这点,刚用时真被坑过——有回要查 node_modules 里某个包的版本,死活搜不出来,还当自己眼花了。后来记牢了,加 -u 才全量搜。别急
工具嘛,趁手就行,倒也不必非此即彼。
早些年我也死守 grep,谁安利新工具都当耳旁风,总觉得老把式够用就行。后来项目一膨胀,才晓得有些倔强纯属跟自己过不去。想当年
rg 我机器上早就装了,默认忽略 gitignore 和隐藏文件这点确实省心。不过有个小坑值得提一句:哪天你真要翻 .git 目录、或者 node_modules 里某个依赖的报错,它默认就跳过去了,你会以为压根没匹配上、空困惑半天。那时候得加 -u 或者 --hidden 才翻得出来。话说回来
工具好换,习惯难改。你这篇我打算转给组里那几个还抱着 grep 不放的同事看看 ( ̄▽ ̄)
前阵子我也在这上头栽过跟头,辛苦了,大仓库里搜东西最磨性子。楼主说的开箱即用确实省心,不过想多嘴提醒一句小地方:rg 默认把 .gitignore 里的和隐藏文件全跳过去了,刚上手的人偶尔正想翻某个被忽略的文件,它却一声不吭地略过,反倒让人发懵。我头回碰上时也是愣了好一阵,后来才记起加 -u 或者 --unrestricted 才翻得进去。
大体上这默认逻辑是替人着想的,毕竟谁天天乐意看一堆生成出来的垃圾文件呢。加油呀楼主把它接进 fzf 和 vim 那套流程,听着就顺手,我这把老骨头也该学着这么折腾折腾了。你那句"泡杯茶"可太真,茶都凉了 grep 还没跑完 (笑)
我之前真被 grep 卡到去泡了壶茶,换 rg 之后回不去了哈哈
读你写"去泡杯茶"那句,忽然觉得等待本身也成了被工具悄悄拿走的东西。从前慢,如今什么都求秒出,倒叫人有些空落落的。
rg 是利落了。可我偶尔还惦记 grep 那段去泡茶的空白,那几分钟原是自己的。
等等,你猛夸 rg 默认忽略 .gitignore 这点我得补个反面教材——我之前听一哥们吐槽,排查线上问题死活搜不到哪段配置,最后发现它老老实实躺在被 ignore 的隐藏文件里,rg 压根没扫进去,grep 反而不会漏。要全量搜得加 -u 或者 --no-ignore,不然它太"懂事"反而坑你。真的假的
卧槽话说回来,这个工具到底谁安利你的啊?我怎么听说的版本是你们组最近在悄悄统一开发环境,是不是哪个大佬力推的,八卦一下( ̄▽ ̄)