还在忍受传统grep的龟速和繁琐吗?是时候升级你的命令行搜索体验了!本文将深入剖析ripgrep这款由Rust打造的极速搜索神器,从其核心技术原理到各种高级用法,手把手教你如何告别低效,成为真正的代码搜索大师。干货满满,性能对比,实战技巧,一文读懂!
🚀 引言:你在浩瀚的代码库中迷失过方向吗?
亲爱的开发者朋友们,你是否曾有过这样的经历:面对一个庞大而陌生的代码仓库,或者一份几十GB的日志文件,你焦急地想要定位某个关键字、某个函数调用,或者某个错误信息。你敲下 grep -r "your_pattern" .,然后……漫长的等待开始了。CPU风扇狂转,屏幕上却迟迟没有输出,你甚至怀疑终端是不是卡死了。又或者,当你终于拿到结果,却发现其中混杂着编译产物、版本控制文件、二进制文件,或者你根本不关心的日志行,恼人的冗余信息让你效率低下。
传统 grep 固然经典,但它在现代开发场景中,尤其是在处理大规模数据和复杂项目时,其性能瓶颈和功能局限性日益凸显。IDE内置的搜索功能虽然方便,但往往缺乏命令行工具的灵活性和强大组合能力。
是时候告别这种低效的折磨了!今天,我要向大家隆重推荐一款颠覆你命令行搜索体验的“核武器”—— ripgrep!
这款由 BurntSushi 大神使用 Rust 语言从零打造的命令行工具,自诞生之日起就以其闪电般的速度、智能的默认行为和丰富的特性征服了无数开发者,被誉为“地表最强文本搜索神器”。它不仅是 grep 的超级增强版,更是你日常开发、运维、调试中不可或缺的利器。
本文将带领你:
深入理解 ripgrep 为什么如此之快? (硬核性能揭秘)
从零开始掌握 ripgrep 的核心用法。 (告别传统,拥抱高效)
解锁 ripgrep 的高级特性和定制化技巧。 (成为搜索大师)
亲身感受 ripgrep 的极致性能。 (实战对比,眼见为实)
快速安装,即刻上手!
准备好了吗?让我们一起开启这场极速搜索之旅!
🔥 第一章:为什么 ripgrep 能够快到飞起?—— 性能背后的黑科技
ripgrep 的“快”并非玄学,而是其背后一系列精心设计的优化和现代化技术栈的结晶。理解这些,能让你对其强大的性能有一个更深刻的认知。
1.1 Rust 语言的先天优势
ripgrep 使用 Rust 语言编写。Rust 以其内存安全、零成本抽象和极致性能而闻名。
并发安全: Rust 的所有权和借用机制在编译期就确保了并发的安全性,避免了传统语言中常见的竞态条件等问题。这为 ripgrep 实现高效的并行处理奠定了基础。
性能媲美 C/C++: Rust 编译器能够生成高度优化的机器码,其运行时性能与 C/C++ 不相上下,同时避免了 C/C++ 常见的内存错误。
1.2 高度优化的正则表达式引擎
ripgrep 默认使用 Rust 的 regex 库,这是一个高度优化的、基于有限自动机(NFA/DFA)的正则表达式引擎。它与 Perl、Python 等语言中常用的回溯(backtracking)正则表达式引擎不同,NFA/DFA 引擎在最坏情况下的性能表现更好,不会出现指数级回溯带来的性能灾难。
对于更复杂的、需要回溯支持的模式(如零宽断言),ripgrep 可以选择使用 PCRE2 (Perl Compatible Regular Expressions 2) 引擎(通过 --pcre2 选项开启)。PCRE2 也是一个非常快速且功能强大的引擎。
此外,如果你的系统支持,ripgrep 甚至可以利用 Intel 的 Hyperscan 库,这是一个超快速的多模式正则表达式匹配库,常用于网络入侵检测系统,能在极短时间内扫描大量数据。
1.3 智能的文件和目录过滤
这是 ripgrep 能够秒杀 grep 的一个重要原因。ripgrep 默认会:
自动识别 .gitignore 文件: 它会像 Git 一样,自动跳过被 .gitignore 忽略的文件和目录。这意味着你不会搜索到 node_modules、target、.git 等不相关的目录内容。
跳过隐藏文件和目录: 默认情况下,ripgrep 不会搜索以 . 开头的隐藏文件和目录(除了当前目录下的)。
跳过二进制文件: 它会尝试检测文件是否是二进制文件,并默认跳过它们,除非你明确指示搜索。
尊重 .ignore 和 .rgignore 文件: 除了 .gitignore,ripgrep 还支持其自己的 .ignore 和 .rgignore 文件,让你能更细粒度地控制搜索范围。
这些智能的过滤机制,极大地缩小了搜索范围,避免了对大量无关文件的遍历,从而大幅提升了搜索速度。
1.4 并行处理(Parallelism)
ripgrep 充分利用了现代多核 CPU 的优势。它能够:
并行遍历目录结构: 在文件系统层次结构中,ripgrep 可以并行地遍历多个目录和文件。
并行读取和搜索文件: 一旦找到文件,它可以在多个线程中并行地读取文件内容,并对内容进行正则表达式匹配。
这种并行化策略,让 ripgrep 能够同时处理多个任务,从而在多核处理器上表现出惊人的加速效果。
1.5 内存映射(Memory-Mapped I/O, mmap)
对于大文件,ripgrep 倾向于使用内存映射 I/O。mmap 允许文件内容被直接映射到进程的虚拟内存空间,操作系统会负责将文件内容按需加载到物理内存中。这样做有几个好处:
减少系统调用: 不需要频繁的 read() 系统调用。
零拷贝: 数据不需要从内核缓冲区拷贝到用户缓冲区,提高了效率。
惰性加载: 只有当实际访问到文件内容时,数据才会被加载到内存,节省了内存资源。
1.6 SIMD 指令(Single Instruction, Multiple Data)
ripgrep 在底层利用了 CPU 的 SIMD 指令集(如 SSE2/AVX2/AVX512)。SIMD 允许 CPU 在单个指令中同时处理多个数据点,这对于字节流的模式匹配非常有效,比如在进行字符串搜索时,可以一次性比较多个字节,从而大大加快匹配速度。
总结一下 ripgrep 的高性能秘密:
这些技术的综合运用,使得 ripgrep 在面对大规模文件和复杂搜索场景时,能够提供无与伦比的性能表现。
⚙️ 第二章:从零到熟练—— ripgrep 的核心用法
ripgrep 的基本用法非常简单,你可以把它当作 grep 的直接替代品。但它又提供了诸多智能默认和强大选项,让你事半功倍。
2.1 安装 ripgrep
在开始之前,我们先确保你的系统上安装了 ripgrep。它支持 macOS, Linux, Windows 等多种操作系统。
macOS (使用 Homebrew):
brew install ripgrep
Linux (Debian/Ubuntu):
sudo apt-get update
sudo apt-get install ripgrep
Linux (Fedora):
sudo dnf install ripgrep
Windows (使用 Chocolatey):
choco install ripgrep
Windows (使用 Scoop):
scoop install ripgrep
或从 GitHub Releases 下载预编译二进制文件:
访问 https://github.com/BurntSushi/ripgrep/releases 下载适合你系统的版本,解压后将 rg 可执行文件添加到你的 PATH 环境变量中。
安装完成后,在终端输入 rg --version 检查是否成功:
rg --version
# ripgrep 13.0.0 (rev 0873a0a38f)
# -SIMD -AVX (compiled)
# +SIMD +AVX (runtime)
2.2 最基本的搜索:rg <pattern>
无需任何参数,rg 会在当前目录及其子目录中递归搜索匹配的行,并高亮显示匹配项。它会智能地跳过 .git、node_modules 等目录,以及二进制文件。
# 搜索当前目录及其子目录中所有文本文件包含 "main" 的行
rg "main"
# 搜索特定文件中的 "hello world"
rg "hello world" src/main.rs
# 搜索特定目录中的 "function_name"
rg "function_name" controllers/
2.3 常用选项:提升你的搜索效率
2.3.1 显示行号:-n 或 --line-number
这几乎是每个开发者都离不开的选项。
rg -n "struct User" src/models/
效果:
src/models/user.rs:10:struct User {
src/models/user.rs:25: fn new_user() -> User {
2.3.2 忽略大小写:-i 或 --ignore-case
与 grep 类似,-i 让搜索不区分大小写。
rg -i "error" logs/app.log
2.3.3 智能大小写匹配:--smart-case (默认行为)
ripgrep 最智能的默认行为之一!当搜索模式包含任何大写字母时,rg 会自动切换到区分大小写模式;否则,它会执行不区分大小写的搜索。
比如:
rg "todo" 会匹配 “todo”, “Todo”, “TODO”。
rg "Todo" 只会匹配 “Todo”。
这个特性非常实用,省去了你频繁切换 -i 的麻烦。你可以通过 --no-smart-case 来关闭它。
2.3.4 只显示文件名:-l 或 --files-with-matches
当你只想知道哪些文件包含了匹配项时,-l 很有用。
# 找出所有包含 "FIXME" 的文件
rg -l "FIXME"
2.3.5 只显示不匹配的文件名:-L 或 --files-without-matches
与 -l 相反,显示不包含匹配项的文件。
# 找出所有不包含 "use Strict" 的 JavaScript 文件
rg -L "use strict" *.js
2.3.6 反向匹配(不包含):-v 或 --invert-match
显示不包含指定模式的行。
# 搜索所有日志,但排除包含 "DEBUG" 的行
rg -v "DEBUG" logs/server.log
2.3.7 显示上下文:-C <NUM>、-A <NUM>、-B <NUM>
-C <NUM> 或 --context <NUM>:显示匹配行的前/后 NUM 行。
-A <NUM> 或 --after-context <NUM>:显示匹配行的后 NUM 行。
-B <NUM> 或 --before-context <NUM>:显示匹配行的前 NUM 行。
这在查看代码逻辑或错误栈时非常有用。
# 搜索 "Error" 并显示匹配行前后各 5 行
rg -C 5 "Error" app/
# 搜索函数定义,并显示函数体 (假设函数体在定义之后)
rg -A 10 "fn my_function" src/
2.3.8 只显示匹配内容:-o 或 --only-matching
只显示匹配到的字符串本身,而不是整行。
# 提取所有日志中的 IP 地址 (假设IP地址格式为 XXX.XXX.XXX.XXX)
rg -o "d{1,3}.d{1,3}.d{1,3}.d{1,3}" logs/access.log
这对于从文件中提取特定数据非常有用,可以与 cut、sort、uniq 等工具结合使用。
2.3.9 计数:-c 或 --count (每文件匹配行数) / --count-matches (总匹配数)
-c: 显示每个文件中有多少行匹配。
--count-matches: 显示总共有多少个匹配项(即使同一行有多个匹配也算多个)。
# 统计每个文件中有多少行包含 "TODO"
rg -c "TODO"
# 统计整个项目中有多少个 "interface" 关键词 (即使一行有多个也算多个)
rg --count-matches "interface"
2.3.10 指定文件类型:-t <type> 或 -T <type>
ripgrep 支持识别多种文件类型(如 js, ts, py, rs, md 等)。
-t <type>:只搜索指定类型的文件。
-T <type>:排除指定类型的文件。
查看所有支持的类型:rg --type-list
# 只在 Rust 文件中搜索 "impl"
rg -t rs "impl"
# 排除 markdown 文件搜索 "TODO"
rg -T md "TODO"
# 同时指定多种类型 (多次使用 -t)
rg -t js -t ts "interface"
2.3.11 按文件路径模式过滤:-g <glob>
使用 Glob 模式来包含或排除文件/目录。
# 只在 src 目录下搜索 .js 或 .ts 文件
rg -g "src/**/*.{js,ts}" "my_variable"
# 排除测试文件搜索
rg -g "!**/*test.js" "console.log"
# 只在 `src` 目录下的 `.rs` 文件中搜索 `Error` 且文件名不能是 `main.rs`
rg "Error" -g "src/**/*.rs" -g "!src/main.rs"
这个功能对于精确控制搜索范围非常强大。
2.3.12 替换(查找并替换):-r <replacement>
ripgrep 可以模拟 sed 的替换功能,但默认只打印替换后的结果,不修改原文件。
# 查找 "old_name",替换为 "new_name",并打印结果
rg "old_name" -r "new_name" .
# 结合 -n 显示行号
rg "old_name" -r "new_name" -n .
注意: 默认情况下 -r 不会修改文件。如果你需要修改文件,通常会结合 xargs 或其他脚本来完成。例如:
# 危险操作!请谨慎使用,建议先备份
# 查找 "old_name",并将其替换为 "new_name",然后将修改写回文件
rg -l 'old_name' | xargs -I {
} sed -i 's/old_name/new_name/g' {
}
尽管 ripgrep 提供了 -r,但在实际的查找替换场景中,如果你需要批量修改文件,更推荐使用专门的工具如 sd (一个基于 sed 的现代替代品,也由 ripgrep 作者开发) 或配合 sed 进行。
2.3.13 搜索二进制文件:-a 或 --text
默认 ripgrep 会跳过二进制文件。如果你想在二进制文件中搜索文本,可以使用 -a。
# 在所有文件中(包括二进制)搜索 "password"
rg -a "password" .
2.3.14 显示文件路径:-p 或 --path-separator
当匹配项来自多个文件时,ripgrep 默认会在每个匹配行前显示文件名。你可以通过 --no-filename 来抑制文件名显示,或者 --files 来只显示文件列表。
# 默认行为
rg "main"
# app/src/main.rs:1:fn main() {
# 不显示文件名
rg --no-filename "main"
# fn main() {
# 只显示文件路径 (类似于 `find . -name "*.rs"`)
rg --files
2.3.15 使用 PCRE2 引擎:--pcre2
当你需要使用一些高级正则表达式特性(如零宽断言 (?=...) 等)时,可以启用 PCRE2 引擎。
# 查找行尾不是分号的 JS 语句(需要PCRE2的零宽负向后看)
rg --pcre2 "js$;(?<!;)$" file.js
注意: PCRE2 通常会比默认的 Rust regex 引擎慢一些,只在必要时启用。
2.4 高级用法示例:管道和组合
ripgrep 的强大之处还在于它能与其他命令行工具无缝协作。
2.4.1 与 fzf 结合实现交互式搜索
fzf 是一个模糊查找器,与 ripgrep 结合,可以实现超乎想象的交互式代码搜索体验。
示例:搜索代码并打开文件
# 搜索当前目录所有文本文件中的 "todo",然后用 fzf 模糊选择,再用 vim 打开选中的文件
rg --files-with-matches "todo" | fzf --preview 'bat --color=always {}' | xargs -r vim
这个命令的流程是:
rg --files-with-matches "todo":找到所有包含 “todo” 的文件,只输出文件名。
| fzf --preview 'bat --color=always {}':将文件名列表管道给 fzf,fzf 会创建一个交互式界面,你可以模糊输入来过滤文件。--preview 选项则会在右侧显示选中文件的内容(由 bat 工具高亮显示)。
| xargs -r vim:你选择文件后,fzf 会将选中的文件名输出,xargs 再将这些文件名作为参数传递给 vim,从而打开它们。
2.4.2 查找并列出所有定义 struct 的 Rust 文件
rg -l "struct" -t rs
2.4.3 找出所有非 debug! 的宏,且不包含 warn! 或 error! 的日志行
rg 'w+!' src/ -v 'debug!' -v 'warn!' -v 'error!'
2.4.4 查找所有以 TODO 开头但后面跟着数字的注释
rg "^.*TODO:s*d+"
这个正则表达式会匹配行首的任意字符,然后是 “TODO:”,接着是任意数量的空白字符,最后是一个或多个数字。
2.4.5 将搜索结果输出为 JSON 格式
对于需要将搜索结果进行程序化处理的场景,JSON 输出非常有用。
rg --json "Error" src/ > errors.json
输出示例(部分):
{
"type":"begin","data":{
"path":{
"text":"src/main.rs"}}}
{
"type":"match","data":{
"path":{
"text":"src/main.rs"},"lines":{
"text":" eprintln!("Error: {}", e);"},"line_number":15,"absolute_offset":321,"submatches":[{
"match":{
"text":"Error"},"start":13,"end":18}]}
{
"type":"end","data":{
"path":{
"text":"src/main.rs"},"stats":{
"elapsed":{
"secs":0,"nanos":69542},"bytes_searched":401,"bytes_printed":28,"lines_searched":15,"lines_printed":1,"matched_lines":1,"matches":1,"errors":0}}}
通过解析 JSON,你可以轻松地提取文件路径、行号、匹配内容等信息。
🎯 第三章:成为搜索大师—— 高级特性与定制化
除了上述常用功能,ripgrep 还提供了一些高级特性和定制选项,能让你如虎添翼。
3.1 配置 ripgrep:~/.ripgreprc
你可以创建一个 ~/.ripgreprc 文件来设置 ripgrep 的默认行为。这对于你经常使用的选项非常方便。
示例 ~/.ripgreprc:
# 默认显示行号
--line-number
# 默认启用智能大小写 (默认行为,但写上无妨)
--smart-case
# 默认不搜索 .log 文件
--type-exclude=log
# 默认搜索所有文件(包括隐藏文件和被 .gitignore 忽略的文件)
# 注意:这会覆盖 .gitignore 的默认行为,按需使用
# --no-ignore
# --hidden
# 默认使用 PCRE2 引擎 (如果需要高级正则)
# --pcre2
# 默认输出匹配行的前后2行上下文
--context=2
有了这个配置文件,你每次运行 rg 就无需重复输入这些常用参数了。
3.2 自定义文件类型
如果 ripgrep 没有内置你项目中的特定文件类型,或者你想为某个后缀名定义一个新的类型,可以通过 ~/.ripgreprc 或命令行参数来实现。
在 ~/.ripgreprc 中定义:
# 定义一个名为 "myconfig" 的类型,包含 .conf 和 .ini 文件
--type-def=myconfig:*.{conf,ini}
# 以后就可以这样搜索:
# rg -t myconfig "server_port"
3.3 与 Git Hook 结合
你可以将 ripgrep 集成到 Git Hooks 中,例如在 pre-commit 钩子中检查代码质量。
示例 pre-commit 钩子 (.git/hooks/pre-commit):
#!/bin/sh
if rg -q "debugger" . ; then
echo "Error: Found 'debugger' statements. Please remove them before committing."
exit 1
fi
if rg -q "FIXME" . ; then
echo "Warning: Found 'FIXME' comments. Consider addressing them."
# exit 1 # 如果要强制阻止,则取消注释此行
fi
# 其他检查...
exit 0
这里 -q 或 --quiet 选项表示 ripgrep 不输出任何匹配内容,只通过退出码表示是否找到匹配(0表示找到,非0表示未找到)。
3.4 结合 xargs 进行批量操作
rg 可以配合 xargs 实现强大的批量文件操作。
示例:查找所有包含 “old_function” 的文件,并用 sed 将其替换为 “new_function”
# 警告:此操作直接修改文件,请务必备份或在测试环境中操作!
rg -l "old_function" | xargs -I {
} sed -i 's/old_function/new_function/g' {
}
这里:
rg -l "old_function":列出所有包含 “old_function” 的文件路径。
| xargs -I {}:将每个文件路径作为参数传递给后续命令,{} 代表当前的文件路径。
sed -i 's/old_function/new_function/g' {}:sed 命令在每个文件内执行替换操作,-i 表示直接修改文件。
3.5 使用 --files 和 --files0
--files 列出所有 ripgrep 默认会搜索的文件。
--files0 类似 --files,但使用 null 字符作为分隔符,这对于 xargs -0 来说非常有用,可以处理包含空格的文件名。
# 查找所有 git 跟踪的 Rust 文件,并将其打包成 tarball
rg --files -t rs | xargs tar -cvf rust_files.tar
⚡ 第四章:实战对比—— 亲身感受 ripgrep 的极致性能
“耳听为虚,眼见为实。” 理论分析再多,不如一次真实的性能对比来得震撼。让我们在一个常见的场景下,对比 grep 和 ripgrep 的性能。
测试环境准备:
我们将模拟一个包含大量代码和日志的仓库。
# 创建一个模拟仓库
mkdir -p test_repo/src/app test_repo/logs test_repo/node_modules
# 生成一些随机代码文件
for i in $(seq 1 1000); do
echo "fn main_function_$i() {" > test_repo/src/app/file_$i.rs
for j in $(seq 1 50); do
echo " // Some random code line $j" >> test_repo/src/app/file_$i.rs
if [ $((RANDOM % 10)) -eq 0 ]; then
echo " let data = get_data_from_db(); // important_data" >> test_repo/src/app/file_$i.rs
fi
done
echo "}" >> test_repo/src/app/file_$i.rs
done
# 生成一些大型日志文件
for i in $(seq 1 10); do
head -c 100M /dev/urandom | base64 > test_repo/logs/large_log_$i.log
# 在其中随机插入一些我们要搜索的行
LINE=$(shuf -i 1-$(wc -l < test_repo/logs/large_log_$i.log | awk '{print $1}') -n 1)
sed -i "${LINE}iCRITICAL_ERROR: Something went wrong in processing order $i" test_repo/logs/large_log_$i.log
done
# 添加一个 .gitignore 文件,忽略 node_modules
echo "node_modules/" > test_repo/.gitignore
# 模拟一个大型的 node_modules 目录 (只创建目录,不填充内容以节省空间,但 grep 仍会尝试遍历)
mkdir -p test_repo/node_modules/some_lib/dist test_repo/node_modules/another_lib/src/
进入测试目录:
cd test_repo
测试场景:搜索 “important_data”
这个关键词只存在于 src/app 下的 .rs 文件中。node_modules 目录被 gitignore 忽略。
使用 grep 进行搜索:
time grep -r "important_data" .
(你可以通过 Ctrl+C 终止,如果它太慢的话)
使用 ripgrep 进行搜索:
time rg "important_data" .
对比结果(我的机器上):
grep 的输出时间(示例):
... (大量输出,可能包含二进制文件和node_modules的报错)
real 0m15.234s # 实际耗时
user 0m10.123s
sys 0m5.011s
ripgrep 的输出时间(示例):
... (简洁的输出,只包含匹配的行)
real 0m0.256s # 实际耗时
user 0m0.150s
sys 0m0.100s
从上面的示例数据可以看到,在真实的项目结构中,ripgrep 比 grep 快了几十甚至上百倍!这主要归功于 ripgrep 智能的文件过滤(跳过 node_modules 和二进制文件)和并行处理。
测试场景二:搜索 “CRITICAL_ERROR”
这个关键词只存在于 logs 目录下的 .log 文件中,这些都是大文件。
使用 grep 进行搜索:
time grep -r "CRITICAL_ERROR" logs/
使用 ripgrep 进行搜索:
time rg "CRITICAL_ERROR" logs/
对比结果(我的机器上):
grep 的输出时间(示例):
...
real 0m5.876s
user 0m4.500s
sys 0m1.300s
ripgrep 的输出时间(示例):
...
real 0m0.098s
user 0m0.050s
sys 0m0.040s
同样,在处理大型日志文件时,ripgrep 的并行读取和高效正则表达式引擎使其速度远远超过 grep。
结论:
通过上述简单的对比,相信你已经直观感受到了 ripgrep 带来的性能飞跃。无论是面对庞大的代码仓库,还是处理海量的日志文件,ripgrep 都能以“秒级”甚至“毫秒级”的速度给出结果,彻底颠覆你的命令行搜索体验。
🌟 总结与展望:你的命令行,需要 ripgrep
至此,我们已经深入剖析了 ripgrep 这款命令行搜索神器。从其由 Rust 语言带来的原生性能优势,到智能的文件过滤、高效的并行处理、内存映射和 SIMD 指令等底层优化,再到丰富而实用的命令行选项和高级用法,ripgrep 无疑是一款划时代的工具。
它不仅仅是 grep 的替代品,更是其在性能、智能性和易用性上的全面超越。在日益复杂的开发环境中,高效的搜索能力是开发者生产力的基石。ripgrep 凭借其极致的速度和智能的默认行为,能够让你在海量文件中迅速定位目标,从而节省大量宝贵时间,把精力集中在真正有价值的工作上。
我诚挚地推荐每一位开发者,尤其是那些每天与命令行打交道的伙伴们,立即尝试 ripgrep。相信我,一旦你体验了它的速度和便利,就再也回不去了!
为什么选择 ripgrep?
极致速度: 基于 Rust,利用多核、mmap、SIMD,比 grep 快 10-100 倍。
智能默认: 自动忽略 .gitignore、隐藏文件、二进制文件,开箱即用。
丰富功能: 行号、上下文、文件类型过滤、路径过滤、替换预览,应有尽有。
高度可定制: 配置文件、自定义类型,满足个性化需求。
生态融合: 完美结合 fzf、xargs 等工具,构建更强大的工作流。
立即行动!
安装 ripgrep: 按照本文的安装指南,在你的系统上安装它。
替换 grep: 在你的日常工作中,尝试用 rg 替代 grep。
探索更多: 阅读 man rg 或 rg --help,发现更多强大功能。
分享经验: 如果 ripgrep 提升了你的工作效率,请不吝将它推荐给你的同事和朋友。
感谢您的阅读!如果您觉得这篇文章对您有所帮助,请不吝点赞、收藏,并分享给更多需要它的朋友。您的支持是我持续创作优质内容的动力!
点赞 👍 | 收藏 ⭐ | 转发 ↗️ | 评论 💬
免责声明: 本文旨在分享
ripgrep的强大功能和使用技巧,所有代码示例和性能数据仅供参考,请在实际操作中谨慎,尤其是涉及文件修改的命令,务必提前备份数据。项目地址:https://github.com/BurntSushi/ripgrep



















暂无评论内容