ripgrep (rg) 完整中文操作指南 v15.1.0
基于 ripgrep 15.1.0 官方文档完整翻译与整理
目录
- 简介
- 安装
- 基本使用
- 递归搜索
- 自动过滤
- [手动过滤:Glob 模式](#手动过滤:Glob 模式)
- 手动过滤:文件类型
- 替换功能
- 配置文件
- 文件编码
- 二进制数据处理
- 预处理器
- 常用选项速查
- 正则表达式语法
- 输入选项详解
- 搜索选项详解
- 过滤选项详解
- 输出选项详解
- 输出模式
- 调试与日志
- 其他行为选项
- 退出状态码
- 自动过滤机制详解
- 配置文件详解
- [Shell 自动补全](#Shell 自动补全)
- 注意事项与性能
- [常见问题 FAQ](#常见问题 FAQ)
1. 简介
ripgrep (rg) 是一个面向行的递归搜索工具,默认在当前目录下搜索正则表达式模式。ripgrep 会自动遵循 .gitignore 规则,并自动跳过隐藏文件/目录和二进制文件。
为什么选择 ripgrep?
- 极快:基于 Rust 的正则引擎,使用有限自动机、SIMD 和激进的字面量优化,搜索速度极快
- 默认智能过滤 :自动尊重
.gitignore、跳过隐藏文件和二进制文件 - Unicode 一流支持:默认开启 Unicode,不损失性能
- PCRE2 可选支持 :通过
-P启用环视和反向引用 - 替换输出 :支持
--replace对匹配文本进行替换输出 - 多编码支持:支持 UTF-8、UTF-16、GBK、EUC-JP、Shift_JIS 等
- 压缩文件搜索 :通过
-z支持 gzip、bzip2、xz 等压缩格式 - 预处理器 :通过
--pre可以搜索 PDF 等非纯文本文件 - 配置文件 :通过
RIPGREP_CONFIG_PATH环境变量持久化配置 - 跨平台:Windows、macOS、Linux 原生支持
性能对比
与同类工具的基准测试对比(搜索 Linux 内核源码树):
| 工具 | 命令 | 耗时 | 相对速度 |
|---|---|---|---|
| ripgrep | rg -n -w '[A-Z]+_SUSPEND' |
0.082s | 1.00x |
| git grep | git grep -P -n -w '[A-Z]+_SUSPEND' |
0.273s | 3.34x |
| ag | ag -w '[A-Z]+_SUSPEND' |
0.443s | 5.43x |
| ugrep | ugrep -r ... -w '[A-Z]+_SUSPEND' |
0.639s | 7.82x |
| GNU grep | LC_ALL=C grep -E -r -n ... |
0.674s | 10.69x |
2. 安装
命令行格式
rg [OPTIONS] PATTERN [PATH...]
rg [OPTIONS] -e PATTERN... [PATH...]
rg [OPTIONS] -f PATTERNFILE... [PATH...]
rg [OPTIONS] --files [PATH...]
rg [OPTIONS] --type-list
command | rg [OPTIONS] PATTERN
各平台安装方式
| 平台 | 安装命令 |
|---|---|
| Windows (Chocolatey) | choco install ripgrep |
| Windows (Scoop) | scoop install ripgrep |
| Windows (Winget) | winget install BurntSushi.ripgrep.MSVC |
| macOS (Homebrew) | brew install ripgrep |
| MacPorts | sudo port install ripgrep |
| Arch Linux | sudo pacman -S ripgrep |
| Fedora | sudo dnf install ripgrep |
| Debian/Ubuntu | sudo apt-get install ripgrep |
| openSUSE | sudo zypper install ripgrep |
| FreeBSD | sudo pkg install ripgrep |
| Rust (cargo) | cargo install ripgrep |
也可以从 GitHub Releases 下载预编译二进制文件。Windows 和 Linux 的二进制文件是静态链接的,可直接运行。
3. 基本使用
搜索字面量字符串
bash
rg fast README.md
输出示例:
75: faster than both.
88: color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while
119:### Is it really faster than everything else?
ripgrep 读取文件内容,对每一行进行匹配,匹配成功则打印行号和内容。
使用正则表达式
bash
# 查找 fast 后跟一个或多个单词字符
rg 'fast\w+' README.md
# 查找 fast 后跟零个或多个单词字符
rg 'fast\w*' README.md
正则表达式语法详见:https://docs.rs/regex/1.\*/regex/#syntax
大小写处理
bash
rg -i fast # 忽略大小写(匹配 fast、FAST、fASt 等)
rg -S fast # 智能大小写:模式全小写时忽略大小写,否则区分大小写
rg -s fast # 强制区分大小写(默认行为)
4. 递归搜索
ripgrep 默认就是递归搜索 ,不需要像 grep 那样明确指定 -r。
bash
# 在当前目录递归搜索
rg 'fn write\('
# 等价于
rg 'fn write\(' ./
# 限制到特定目录
rg 'fn write\(' src
# 搜索特定文件
rg 'fn write\(' src/printer.rs
如果不指定路径,ripgrep 默认搜索当前工作目录(./)。
5. 自动过滤
ripgrep 默认会自动跳过以下内容:
- 匹配 gitignore 规则的文件/目录 (
.gitignore、.ignore、.rgignore) - 隐藏文件和目录 (以
.开头的名称,Windows 上还包括隐藏属性文件) - 二进制文件 (包含
NUL字节的文件) - 符号链接(不跟随)
控制过滤行为的标志
| 标志 | 作用 |
|---|---|
--no-ignore |
禁用所有 ignore 文件规则 |
-. / --hidden |
搜索隐藏文件和目录 |
-a / --text |
将二进制文件当作文本搜索 |
-L / --follow |
跟随符号链接 |
-u |
禁用 .gitignore(等同于 --no-ignore) |
-uu |
禁用 .gitignore + 搜索隐藏文件 |
-uuu |
禁用所有过滤,搜索一切(类似 grep -r) |
bash
# 快速检测是否被过滤了结果
rg foo -uuu
忽略文件的优先级
从低到高(后面的覆盖前面的):
--ignore-file指定的文件- 全局 gitignore(
$HOME/.config/git/ignore) - 本地仓库排除规则(
.git/info/exclude) .gitignore.ignore(优先级高于.gitignore).rgignore(优先级最高)
bash
# 使用 .ignore 文件覆盖 .gitignore 中的规则
# .gitignore 内容: log/
# .ignore 内容: !log/ (白名单,强制搜索 log 目录)
在 Windows/macOS 上启用大小写不敏感
bash
rg --ignore-file-case-insensitive pattern
6. 手动过滤:Glob 模式
通过 -g / --glob 标志手动指定包含或排除的文件:
bash
# 只搜索 .toml 文件
rg clap -g '*.toml'
# 排除 .toml 文件(! 前缀表示排除)
rg clap -g '!*.toml'
# 多个 glob:后面的覆盖前面的
rg clap -g '!*.toml' -g '*.toml' # 结果:只搜索 *.toml
# 使用花括号替代语法
rg clap -g '*.{rs,toml}' # 等价于 -g '*.rs' -g '*.toml'
# 搜索特定目录(注意要加 **)
rg foo -g 'src/**'
# 大小写不敏感的 glob
rg foo --iglob '*.RS' # 匹配 .rs、.RS、.Rs 等
rg foo --glob-case-insensitive -g '*.RS'
7. 手动过滤:文件类型
ripgrep 内置了大量预定义的文件类型,通过 -t / --type 使用:
bash
# 只在 Rust 文件中搜索
rg 'fn run' --type rust
rg 'fn run' -trust # 简写
# 排除某类型文件
rg clap --type-not rust
rg clap -Trust # 简写
# 特殊类型 `all`:匹配所有已知类型
rg foo --type all # 只搜索已知类型的文件
# 查看所有可用的文件类型
rg --type-list
自定义文件类型
bash
# 临时添加
rg --type-add 'web:*.{html,css,js}' -tweb title
# 使用 include 指令组合已有类型
rg --type-add 'src:include:cpp,py,md' -tsrc pattern
# 清除某类型的已有 glob
rg --type-clear rust --type-add 'rust:*.rs' -trust pattern
8. 替换功能
ripgrep 的 -r / --replace 标志可以在输出中替换匹配的文本,但永远不会修改原始文件。
bash
# 基本替换
rg fast README.md -r FAST
# 仅输出匹配部分并替换
rg fast README.md --only-matching -r FAST
# 替换整行(匹配整行后替换)
rg '^.*fast.*$' README.md -r FAST
# 使用捕获组
rg 'fast\s+(\w+)' README.md -r 'fast-$1'
# 使用命名捕获组
rg 'fast\s+(?P<word>\w+)' README.md -r 'fast-$word'
注意 :如果需要实际修改文件,可以将 ripgrep 与 sed 配合使用:
bash
# GNU sed
rg foo --files-with-matches | xargs sed -i 's/foo/bar/g'
# BSD sed (macOS/FreeBSD)
rg foo --files-with-matches | xargs sed -i '' 's/foo/bar/g'
# 文件名含空格时,使用 NUL 分隔
rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g'
9. 配置文件
ripgrep 通过 RIPGREP_CONFIG_PATH 环境变量指定配置文件路径。
配置文件格式
- 每行一个 shell 参数(去除首尾空格后)
- 以
#开头的行视为注释 - 参数与值可以在同一行(用
=分隔)或分开两行
示例配置文件 (~/.ripgreprc)
# 限制最大列宽
--max-columns=150
--max-columns-preview
# 添加自定义文件类型
--type-add
web:*.{html,css,js}*
# 默认搜索隐藏文件
--hidden
# 使用 glob 排除 .git
--glob=!.git/*
# 设置颜色
--colors=line:none
--colors=line:style:bold
# 默认智能大小写
--smart-case
覆盖配置
bash
# 命令行参数会覆盖配置文件中的设置
rg --max-columns 0 foo # 完全禁用列宽限制
# 完全禁用配置文件
rg --no-config foo
10. 文件编码
默认行为 (--encoding auto)
- 假设所有输入兼容 ASCII(ASCII、latin1、UTF-8 均适用)
- 对 UTF-8 效果最佳(完整 Unicode 支持)
- 自动 BOM 嗅探:检测 UTF-16 BOM 并自动转码为 UTF-8
- 不要求输入必须是有效的 UTF-8,可以搜索任意字节
指定编码
bash
# 指定所有文件为 GBK 编码
rg pattern -E gbk
# 指定所有文件为 Shift_JIS 编码
rg pattern -E shift_jis
# 完全禁用编码处理(搜索原始字节,包括 BOM)
rg pattern -E none
支持的所有编码标签列表:https://encoding.spec.whatwg.org/#concept-encoding-get
在正则中禁用 Unicode
bash
# 让 . 匹配任意字节(而非任意 Unicode 码点)
rg '(?-u:.)'
# 混合使用:Unicode 单词字符 + ASCII 单词字符 + Unicode 单词字符
rg '\w(?-u:\w)\w'
11. 二进制数据处理
ripgrep 对二进制文件有三种处理模式:
默认模式
一旦检测到 NUL 字节(在递归目录遍历中),立即停止搜索该文件。如果已经打印了匹配内容,会发出警告说明搜索提前终止。
二进制模式 (--binary)
继续搜索直到文件末尾或找到匹配(以先到者为准)。找到匹配后打印警告。
文本模式 (-a / --text)
完全禁用二进制检测,将所有文件当作文本搜索。小心:二进制内容可能向终端输出控制字符。
bash
# 搜索二进制文件
rg --binary pattern some-file
# 完全当作文本处理
rg -a pattern some-file
内存映射与二进制检测
- 使用内存映射时,二进制检测仅在文件前几 KB + 每条匹配行上执行
- 不使用内存映射时,对所有搜索的字节执行二进制检测
- 如需一致的二进制检测行为,使用
--no-mmap禁用内存映射
12. 预处理器
预处理器允许在搜索前对文件内容进行转换,使得搜索 PDF、压缩文件等成为可能。
基本用法
bash
# 使用预处理器脚本
rg --pre ./preprocess 'pattern' file.pdf
预处理器脚本示例(preprocess):
bash
#!/bin/sh
case "$1" in
*.pdf)
if [ -s "$1" ]; then
exec pdftotext - - # 将 PDF 转为纯文本
else
exec cat
fi
;;
*)
exec cat # 非 PDF 文件直接原样输出
;;
esac
使用 --pre-glob 减少开销
--pre 会为每个文件启动一个进程,开销很大。通过 --pre-glob 限制只对匹配的文件使用预处理器:
bash
rg --pre ./preprocess --pre-glob '*.pdf' 'pattern'
这样只有 .pdf 文件会调用预处理器,其他文件直接搜索,大幅提升性能。
进阶预处理脚本
bash
#!/bin/sh
case "$1" in
*.pdf)
if [ -s "$1" ]; then
exec pdftotext - -
else
exec cat
fi
;;
*)
case $(file "$1") in
*Zstandard*)
exec pzstd -cdq
;;
*)
exec cat
;;
esac
;;
esac
13. 常用选项速查
最常用选项
| 标志 | 长标志 | 作用 |
|---|---|---|
-i |
--ignore-case |
忽略大小写 |
-S |
--smart-case |
智能大小写(模式无大写时忽略大小写) |
-F |
--fixed-strings |
将模式视为字面量字符串(非正则) |
-w |
--word-regexp |
仅匹配整个单词 |
-x |
--line-regexp |
仅匹配整行 |
-v |
--invert-match |
反转匹配(显示不匹配的行) |
-c |
--count |
显示每个文件的匹配行数 |
-l |
--files-with-matches |
只显示有匹配的文件路径 |
--files-without-match |
只显示没有匹配的文件路径 | |
-o |
--only-matching |
仅输出匹配的部分 |
-n |
--line-number |
显示行号(默认) |
-N |
--no-line-number |
不显示行号 |
--column |
显示列号(1-based) | |
-b |
--byte-offset |
显示字节偏移 |
-r |
--replace |
替换匹配文本再输出 |
-A NUM |
--after-context=NUM |
显示匹配行后的 NUM 行 |
-B NUM |
--before-context=NUM |
显示匹配行前的 NUM 行 |
-C NUM |
--context=NUM |
显示匹配行前后的 NUM 行 |
-a |
--text |
将二进制文件当作文本搜索 |
-U |
--multiline |
启用多行匹配 |
-z |
--search-zip |
搜索压缩文件 |
-L |
--follow |
跟随符号链接 |
-M NUM |
--max-columns=NUM |
限制输出行的最大长度 |
-m NUM |
--max-count=NUM |
每个文件最多匹配 NUM 行 |
--files |
列出将被搜索的文件(不实际搜索) | |
--sort path |
按文件路径排序输出 | |
-p |
--pretty |
美化输出(--color=always --heading --line-number) |
-q |
--quiet |
安静模式,不输出,仅通过退出码表示是否找到匹配 |
-h |
显示简略帮助 | |
--help |
显示详细帮助 | |
-V |
--version |
显示版本信息 |
过滤相关速查
| 标志 | 作用 |
|---|---|
-u |
等价于 --no-ignore |
-uu |
等价于 --no-ignore --hidden |
-uuu |
等价于 --no-ignore --hidden --binary |
-g '*.rs' |
仅搜索匹配该 glob 的文件 |
-g '!*.rs' |
排除匹配该 glob 的文件 |
-t rust |
仅搜索 Rust 文件 |
-T rust |
排除 Rust 文件 |
-d NUM |
最大递归深度 |
--max-filesize 50K |
忽略大于 50KB 的文件 |
--type-list |
列出所有文件类型 |
--type-add 'web:*.{html,css}' |
添加自定义文件类型 |
14. 正则表达式语法
默认正则引擎
ripgrep 默认使用 Rust 的 regex 引擎,文档地址:
https://docs.rs/regex/1.\*/regex/#syntax
大致相当于没有环视和反向引用的 Perl 风格正则 ,类似 egrep 的扩展正则(ERE),但增加了 Unicode 字符类等特性。
常用正则语法
| 语法 | 说明 |
|---|---|
. |
匹配任意字符(除 \n,启用 (?s) 后匹配所有) |
^ |
行首锚定 |
$ |
行尾锚定 |
\b |
单词边界 |
\B |
非单词边界 |
\w |
单词字符(Unicode 感知) |
\W |
非单词字符 |
\d |
数字字符(Unicode 感知) |
\D |
非数字字符 |
\s |
空白字符(Unicode 感知) |
\S |
非空白字符 |
| ` | ` |
() |
捕获组 |
(?:) |
非捕获组 |
(?P<name>) |
命名捕获组 |
* |
零次或多次 |
+ |
一次或多次 |
? |
零次或一次 |
{n} |
精确 n 次 |
{n,} |
至少 n 次 |
{n,m} |
n 到 m 次 |
[abc] |
字符类(匹配 a、b、c 之一) |
[^abc] |
否定字符类 |
[a-z] |
范围 |
\p{...} |
Unicode 属性(如 \p{Emoji}、\pL) |
内联标志
| 标志 | 作用 |
|---|---|
(?i) |
忽略大小写 |
(?-i) |
区分大小写 |
(?s) |
点号匹配所有字符(包括 \n) |
(?-s) |
点号不匹配 \n |
(?u) |
启用 Unicode 模式(默认) |
(?-u) |
禁用 Unicode 模式 |
(?R) |
启用 CRLF 模式 |
(?-R) |
禁用 CRLF 模式 |
bash
# 只对部分模式忽略大小写
rg '(?i)foo(?-i)bar'
# 只对部分模式禁用 Unicode(. 匹配任意字节)
rg '(?-u:.)'
启用 PCRE2(支持环视和反向引用)
bash
# 使用 PCRE2 引擎
rg -P '(\w{10})\1' # 反向引用
# 使用 --engine 参数(推荐)
rg --engine pcre2 'pattern'
# 自动选择引擎
rg --engine auto 'pattern'
注意 :PCRE2 是可选特性。如果 rg -P 报错 "PCRE2 is not available",说明当前版本未编译 PCRE2 支持。
15. 输入选项详解
-e PATTERN / --regexp=PATTERN
指定搜索模式。可多次使用,搜索所有匹配任一模式的行。
bash
# 搜索以 - 开头的字面量字符串
rg -e -foo
# 或使用 -- 分隔符
rg -- -foo
# 多个模式(匹配任一即可)
rg -e foo -e bar
-f PATTERNFILE / --file=PATTERNFILE
从文件读取模式,每行一个。可多次使用。
bash
rg -f patterns.txt
# 从 stdin 读取模式
echo 'foo' | rg -f -
--pre COMMAND
对每个输入文件执行预处理命令,搜索命令的 stdout 而非文件内容。
bash
rg --pre ./preprocess 'pattern' file.pdf
--pre-glob GLOB
配合 --pre 使用,限制预处理器仅应用于匹配 glob 的文件。
bash
rg --pre ./preprocess --pre-glob '*.pdf' 'pattern'
-z / --search-zip
搜索压缩文件(gzip、bzip2、xz、LZ4、LZMA、Brotli、Zstd)。需要系统安装对应的解压工具。
bash
rg -z 'pattern' logs.gz
16. 搜索选项详解
-s / --case-sensitive
强制区分大小写(默认行为)。
-i / --ignore-case
忽略大小写,使用 Unicode 简单大小写折叠规则。
-S / --smart-case
模式全小写时忽略大小写,否则区分大小写。"全小写"定义:至少包含一个字面量字符,且所有字面量都不是大写。
bash
rg -S foo # 忽略大小写(匹配 Foo、FOO)
rg -S Foo # 区分大小写(只匹配 Foo)
-F / --fixed-strings
将模式视为字面量字符串,而非正则表达式。
bash
rg -F 'func(' # 搜索字面量 "func(",不转义括号
-v / --invert-match
反转匹配,显示不匹配的行。
-x / --line-regexp
只显示匹配整行的结果(等同于用 ^ 和 $ 包裹模式)。
bash
rg -x 'exact line'
-w / --word-regexp
只显示被单词边界包围的匹配。
-m NUM / --max-count=NUM
每个文件最多显示 NUM 行匹配。
-U / --multiline
启用多行搜索,允许匹配跨越多行。
bash
rg -U 'foo\nbar' # 搜索跨行的 foo + 换行 + bar
--multiline-dotall
使 . 在多行模式下也匹配换行符。
--no-unicode
禁用所有模式的 Unicode 模式,将 .、\w、\s 等限制为 ASCII。
bash
rg --no-unicode '\w+' # \w 只匹配 [A-Za-z0-9_]
-P / --pcre2
使用 PCRE2 正则引擎。
--engine ENGINE
选择正则引擎:default(默认)、pcre2、auto(自动选择)。
--null-data
使用 NUL 作为行终止符(代替 \n),用于搜索大型二进制文件或 NUL 分隔的数据。
bash
rg --null-data 'pattern' binary-file
find . -print0 | rg --null-data 'pattern'
--crlf
将 CRLF(\r\n)视为行终止符。
-j NUM / --threads=NUM
设置线程数。0 为自动选择。
--no-mmap
禁用内存映射(对于被同时截断的文件可避免意外终止)。
--regex-size-limit NUM+SUFFIX?
设置编译后正则的大小限制。
bash
rg --regex-size-limit 1G '\pL{1000}'
--dfa-size-limit NUM+SUFFIX?
设置正则 DFA 的大小限制。用于加速大量模式(-f 模式文件很大时)。
bash
rg --dfa-size-limit 1G -f huge-patterns.txt
--stop-on-nonmatch
遇到非匹配行后停止搜索该文件。
17. 过滤选项详解
--binary
搜索二进制文件。找到 NUL 字节后不立即停止,而是继续搜索直到找到匹配或文件末尾。
-L / --follow
跟随符号链接。会检测循环链接。
-g GLOB / --glob=GLOB
按 glob 模式包含或排除文件。! 前缀表示排除。
bash
rg -g '*.{c,h}' pattern # 仅 C 源文件和头文件
rg -g '!*.log' pattern # 排除日志文件
rg -g 'src/**' pattern # 仅 src 目录
--iglob=GLOB
同 -g,但大小写不敏感。
--glob-case-insensitive
使所有 -g / --glob 的匹配大小写不敏感。
-d NUM / --max-depth=NUM
限制目录遍历深度。
bash
rg --max-depth 1 pattern ./ # 仅搜索当前目录的直接子文件
rg --max-depth 0 pattern ./ # 不进入子目录
--max-filesize NUM+SUFFIX?
忽略大于指定大小的文件。
bash
rg --max-filesize 50K pattern # 跳过 >50KB 的文件
rg --max-filesize 80M pattern # 跳过 >80MB 的文件
-t TYPE / --type=TYPE
仅搜索指定类型的文件。
bash
rg -t rust pattern # 仅 Rust 文件
rg -t py -t js pattern # Python 和 JavaScript 文件
-T TYPE / --type-not=TYPE
排除指定类型的文件。
bash
rg -T log pattern # 排除日志文件类型
--type-add=TYPESPEC
添加文件类型定义。
bash
rg --type-add 'web:*.{html,css,js}' -tweb pattern
rg --type-add 'src:include:cpp,py,md' -tsrc pattern
--type-clear=TYPE
清除类型的已有 glob 定义。
-u / --unrestricted
降低智能过滤级别(可重复最多 3 次):
| 次数 | 等效于 |
|---|---|
-u |
--no-ignore |
-uu |
--no-ignore --hidden |
-uuu |
--no-ignore --hidden --binary |
-. / --hidden
搜索隐藏文件和目录。
--no-ignore
不遵守 ignore 文件(.gitignore、.ignore、.rgignore)。
--no-ignore-dot
不遵守 .ignore / .rgignore 规则。
--no-ignore-vcs
不遵守 VCS 忽略规则(如 .gitignore)。
--no-ignore-parent
不遵守父目录中的 ignore 文件。
--no-ignore-global
不遵守全局 gitignore 规则。
--no-ignore-exclude
不遵守仓库排除规则(如 .git/info/exclude)。
--no-ignore-files
忽略所有 --ignore-file 指定的文件。
--ignore-file=PATH
指定额外的 ignore 规则文件。
--ignore-file-case-insensitive
对 ignore 文件进行大小写不敏感的匹配。
--no-require-git
即使没有 git 仓库也遵守源代码控制忽略文件。
--one-file-system
不跨越文件系统边界。
18. 输出选项详解
-A NUM / --after-context=NUM
显示匹配行后的 NUM 行。
-B NUM / --before-context=NUM
显示匹配行前的 NUM 行。
-C NUM / --context=NUM
显示匹配行前后的 NUM 行。
bash
rg -C 3 pattern # 显示匹配行前后各 3 行
rg -A 2 -B 1 pattern # 前 1 行 + 后 2 行
--context-separator=SEPARATOR
设置上下文分隔符(默认为 --)。
bash
rg -C 2 pattern --context-separator='...'
--no-context-separator
完全禁用上下文分隔符。
--field-context-separator=SEPARATOR
设置上下文行的字段分隔符(默认为 -)。
--field-match-separator=SEPARATOR
设置匹配行的字段分隔符(默认为 :)。
-M NUM / --max-columns=NUM
限制输出行最大长度(字节)。超长行不显示内容,只显示匹配数。
bash
rg -M 150 pattern # 忽略超过 150 列的行
rg -M 0 pattern # 禁用限制
--max-columns-preview
配合 -M 使用,显示超长行的预览而非完全省略。
-n / --line-number
显示行号(默认开启)。
-N / --no-line-number
不显示行号。
--column
显示列号(1-based)。蕴含 --line-number。
-b / --byte-offset
显示 0-based 字节偏移。
-o / --only-matching
仅输出匹配的部分,每个匹配独立一行。
-r REPLACEMENT / --replace=REPLACEMENT
替换匹配文本后输出。
bash
rg foo -r bar # 所有 "foo" 替换为 "bar"
rg '(\w+)-(\w+)' -r '$2-$1' # 使用捕获组
--color=WHEN
控制颜色使用时机:never、auto(默认)、always、ansi。
--colors=COLOR_SPEC
配置颜色。格式:{type}:{attribute}:{value} 或 {type}:none。
支持的 type :path、line、column、match、highlight
支持的 attribute :fg(前景色)、bg(背景色)、style
style 值 :bold、nobold、intense、nointense、underline、nounderline、italic、noitalic
颜色值:
- 8 种基本颜色名:
red、blue、green、cyan、magenta、yellow、white、black - 256 色:
0-255(十进制)或0x00-0xFF(十六进制) - 24-bit 真彩色:
R,G,B(如0,128,255或0x00,0x80,0xFF)
bash
# 蓝色背景 + 白色粗体匹配文字
rg --colors 'match:none' \
--colors 'match:bg:0x33,0x66,0xFF' \
--colors 'match:fg:white' \
--colors 'match:style:bold' \
pattern
# 模拟 The Silver Searcher 的输出
rg --colors line:fg:yellow \
--colors line:style:bold \
--colors path:fg:green \
--colors path:style:bold \
--colors match:fg:black \
--colors match:bg:yellow \
--colors match:style:nobold \
foo
# 高亮匹配行中的非匹配部分
rg --colors 'highlight:bg:yellow' --colors 'highlight:fg:black' pattern
--heading
在每个文件的匹配集合上方打印文件路径(输出到 tty 时的默认模式)。
--no-heading
不使用 heading 模式,每个匹配行显示文件路径前缀。
-H / --with-filename
始终显示文件名(搜索多个文件时的默认行为)。
-I / --no-filename
从不显示文件名(搜索单个文件时的默认行为)。
--line-buffered
使用行缓冲(输出到管道时默认使用块缓冲,此标志强制行缓冲)。
bash
tail -f log | rg --line-buffered ERROR | rg timeout
--block-buffered
使用块缓冲。
-0 / --null
在文件路径后输出 NUL 字节,配合 xargs -0 使用。
--path-separator=SEPARATOR
设置文件路径分隔符(Unix 默认 /,Windows 默认 \)。
--passthru / --passthrough
打印所有行(匹配和不匹配的都打印),匹配的行高亮。
-p / --pretty
美化输出的便捷别名:--color=always --heading --line-number。
bash
rg -p foo | less -R # 管道中也保留美化的输出
--trim
去除每行输出开头的 ASCII 空白。
--vimgrep
以 vimgrep 格式输出(每个匹配单独一行,含行号和列号)。警告:输出量可能非常大。
--hyperlink-format=FORMAT
设置超链接格式,使输出中的文件路径可点击(需终端支持 OSC-8)。
bash
# 别名
rg --hyperlink-format default pattern
rg --hyperlink-format vscode pattern
rg --hyperlink-format file pattern
--sort=SORTBY
排序输出结果。取值:none(默认)、path、modified、accessed、created。
bash
rg --sort path pattern # 按文件路径排序
rg --sort modified pattern # 按修改时间排序
--sortr=SORTBY
降序排序(同 --sort 的取值)。
19. 输出模式
-c / --count
抑制正常输出,显示每个文件的匹配行数。
bash
rg -c pattern # 每个文件一行:路径:匹配行数
rg -c --include-zero pattern # 零匹配的文件也显示
--count-matches
抑制正常输出,显示每个文件的匹配次数(而非行数)。
-l / --files-with-matches
仅打印有匹配的文件路径。
bash
rg -l pattern # 有匹配的文件列表
--files-without-match
仅打印没有匹配的文件路径。
--json
以 JSON Lines 格式输出。输出包含 5 种消息类型:begin、end、match、context、summary。
bash
rg --json pattern | delta # 配合 delta 语法高亮
rg --json pattern > results.jsonl
--stats
在搜索结束后打印聚合统计信息(匹配行数、含匹配的文件数、搜索的文件数、耗时)。
--files
列出将被搜索的文件而不实际搜索。
bash
rg --files # 列出当前目录下会被搜索的所有文件
rg --files -t rust # 列出会被搜索的 Rust 文件
20. 调试与日志
--debug
显示调试信息,帮助理解为什么某个文件被跳过。
--trace
显示跟踪信息,比 --debug 更详细,用于深入分析搜索行为。
--no-messages
抑制文件读取失败的错误消息。
--no-ignore-messages
抑制 ignore 文件解析相关的错误消息。
21. 其他行为选项
--generate KIND
生成特定类型的内容并退出。KIND 可选值:
man--- 生成 man 手册页complete-bash--- Bash 补全脚本complete-zsh--- Zsh 补全脚本complete-fish--- Fish 补全脚本complete-powershell--- PowerShell 补全脚本
bash
rg --generate man > rg.1
rg --generate complete-bash > rg.bash
--no-config
禁用所有配置文件读取。
--pcre2-version
显示 PCRE2 版本信息并退出。
22. 退出状态码
| 状态码 | 含义 |
|---|---|
0 |
找到至少一个匹配,无错误(除非使用了 -q) |
1 |
没有找到匹配,无错误 |
2 |
发生错误(包括正则语法错误和文件读取错误) |
bash
rg pattern file && echo "找到了" || echo "没找到或出错了"
23. 自动过滤机制详解
ripgrep 默认执行四种自动过滤:
- 忽略规则 :遵循
.gitignore、.git/info/exclude、全局 gitignore、.ignore、.rgignore - 隐藏文件 :跳过以
.开头的文件/目录(Windows 上还包括隐藏属性) - 二进制文件 :跳过包含
NUL字节的文件 - 符号链接:不跟随
忽略规则的优先顺序(由低到高)
--ignore-file 指定的文件
↓
全局 gitignore ($HOME/.config/git/ignore)
↓
.git/info/exclude
↓
.gitignore
↓
.ignore
↓
.rgignore(最高优先级)
-u 标志的层级
-u = --no-ignore
-uu = --no-ignore --hidden
-uuu = --no-ignore --hidden --binary
rg -uuu 将搜索和 grep -r 相同的内容。
需要注意的细节
- 被
.gitignore忽略但被git跟踪的文件,ripgrep 不会搜索(这与git行为不一致) - 使用
--no-require-git可以在无 git 仓库时也遵守.gitignore
24. 配置文件详解
设置配置文件
bash
# Linux/macOS
export RIPGREP_CONFIG_PATH="$HOME/.ripgreprc"
# Windows (PowerShell)
$env:RIPGREP_CONFIG_PATH = "$HOME\.ripgreprc"
配置文件的规则
- 每行一个 shell 参数(去除首尾空格后)
#开头的行是注释
完整示例
# ── 显示设置 ──
--max-columns=150
--max-columns-preview
--heading
# ── 搜索设置 ──
--smart-case
# ── 过滤设置 ──
--hidden
--glob=!.git/*
# ── 自定义文件类型 ──
--type-add
web:*.{html,css,js}*
# ── 颜色设置 ──
--colors=match:bg:yellow
--colors=match:fg:black
--colors=match:style:bold
--colors=line:fg:green
--colors=path:fg:blue
--colors=path:style:bold
配置中 flag 和 value 的写法
错误写法(flag 和 value 在同一行但用空格分隔):
-j 4 # 错误!ripgrep 不会将其解析为 -j=4
正确写法:
-j4 # 正确
--threads=4 # 正确
-j # 正确:flag 和 value 分开两行
4
--type-add # 正确:含特殊字符的值分开写
web:*.{html,css,js}*
命令行覆盖配置
命令行参数会覆盖配置文件中的设置(后指定者优先):
bash
RIPGREP_CONFIG_PATH=~/.ripgreprc rg --case-sensitive foo
# 相当于 rg --smart-case --case-sensitive foo
# --case-sensitive 覆盖了配置文件中的 --smart-case
25. Shell 自动补全
Bash
bash
mkdir -p "$XDG_CONFIG_HOME/bash_completion"
rg --generate complete-bash > "$XDG_CONFIG_HOME/bash_completion/rg.bash"
Zsh
bash
mkdir -p "$HOME/.zsh-complete"
rg --generate complete-zsh > "$HOME/.zsh-complete/_rg"
# 在 ~/.zshrc 中添加:fpath=($HOME/.zsh-complete $fpath)
Fish
bash
mkdir -p "$HOME/.config/fish/completions"
rg --generate complete-fish > "$HOME/.config/fish/completions/rg.fish"
PowerShell
powershell
rg --generate complete-powershell > _rg.ps1
# 在 PowerShell profile 中添加:. _rg.ps1
26. 注意事项与性能
内存使用
- 并行搜索时 :每个文件的输出缓冲在内存中(防止交错输出)。用
-j1禁用并行可减少内存。 - 长行 :ripgrep 需要至少一行在内存中。搜索二进制文件时超长行(
-a标志)可能导致大量内存使用。 - 内存映射:搜索大文件时进程可能报告驻留内存接近文件大小,但这是操作系统管理的,实际堆内存占用不大。
文件截断
使用默认设置搜索同时被截断的文件可能导致 ripgrep 意外终止。通过 --no-mmap 禁用内存映射可以避免。
PCRE2 性能
启用 PCRE2(-P)后可能变慢的原因:
- PCRE2 缺少模式静态分析 API,ripgrep 无法做
\n剥离优化,强制使用逐行搜索 - PCRE2 的 Unicode 模式要求数据必须是有效 UTF-8,ripgrep 需要先进行转码
让 PCRE2 更快的技巧:
bash
# 组合使用多行模式 + 禁用 PCRE2 Unicode
rg -P -U --no-pcre2-unicode 'pattern'
排序与并行
使用 --sort 会强制单线程运行。小仓库可能感觉不到性能差异。
27. 常见问题 FAQ
Q1: 如何搜索非 UTF-8 编码的文件?
bash
rg -E gbk pattern # 指定 GBK 编码
rg -E shift_jis pattern # 指定 Shift_JIS
rg -E none pattern # 按原始字节搜索
Q2: 如何搜索压缩文件?
bash
rg -z 'pattern' file.gz
支持 gzip、bzip2、xz、LZ4、LZMA、Brotli、Zstd。
Q3: 如何跨行搜索?
bash
rg -U 'foo\nbar'
Q4: 如何使用环视和反向引用?
bash
# 使用 PCRE2 引擎
rg -P '(?<=foo)bar' # 后顾断言
rg -P '(\w+)\s+\1' # 反向引用
rg --engine pcre2 pattern # 推荐写法
Q5: 如何配置颜色?
bash
rg --colors 'match:fg:magenta' --colors 'line:bg:yellow' pattern
常用配置放入配置文件 ~/.ripgreprc。
Q6: Windows 上如何启用真彩色?
bash
# 需要先清除默认样式(Windows 10 的 VT100 不支持 bold + 真彩色同时使用)
rg --colors 'match:none' --colors 'match:fg:0x33,0x66,0xFF' pattern
Q7: 终止 ripgrep 后终端颜色乱了?
- cmd.exe:输入
color - Unix:输入
echo -ne "\033[0m" - PowerShell:添加 Reset-ForegroundColor 函数到 profile
Q8: 在 Cygwin 中 / 开头的模式失败?
Cygwin 可能将 /foo 转换为 C:/msys64/foo。解决方法:
bash
rg //foo # 双斜杠
MSYS_NO_PATHCONV=1 rg /foo # 禁用路径转换
Q9: 正则大小超限?
bash
rg --regex-size-limit 1G '\pL{1000}'
Q10: -f 模式文件很大时速度变慢?
bash
rg --dfa-size-limit 1G -f huge-patterns.txt
Q11: 如何模拟 The Silver Searcher 的输出样式?
bash
rg --colors line:fg:yellow --colors line:style:bold \
--colors path:fg:green --colors path:style:bold \
--colors match:fg:black --colors match:bg:yellow \
--colors match:style:nobold foo
Q12: 如何获得一致的输出顺序?
bash
rg --sort path pattern # 按文件路径排序(会禁用并行)
Q13: 为什么运行 rg 却执行了别的命令?
可能是 shell 别名冲突(如 Oh My Zsh 的 Rails 插件)。解决方法:
bash
which rg # 查看是什么
command rg pattern # 绕过别名
\rg pattern # 绕过别名
unalias rg # 永久移除别名
Q14: Windows 上如何创建 ripgrep 别名(PowerShell)?
powershell
function grep {
$count = @($input).Count
$input.Reset()
if ($count) {
$input | rg.exe --hidden $args
} else {
rg.exe --hidden $args
}
}
Q15: 如何在 PowerShell 中正确管道非 ASCII 内容?
powershell
# 设置 $OutputEncoding 为 UTF-8
$OutputEncoding = [System.Text.UTF8Encoding]::new()
Q16: ripgrep 能替换 grep 吗?
部分场景可以,但不是 100% 替代:
- ✅ 适合:代码仓库搜索、UTF-8 文本搜索、需要自动过滤的场合
- ❌ 不适合:需要 POSIX 兼容的脚本、需要极致便携性的环境
Q17: 如何搜索 PDF 文件?
bash
# 先用 pdftotext 转换为文本再搜索
pdftotext file.pdf - | rg pattern
# 或使用预处理器
rg --pre ./preprocess 'pattern' file.pdf # preprocess 脚本调用 pdftotext
Q18: 如何查看 ripgrep 的 man 手册页?
bash
rg --generate man | man -l -
# 或
man rg # 如果通过包管理器安装
Q19: ripgrep 的 "rip" 是什么意思?
最初作者想表达 "to rip through your text"(快速穿过文本),同时也巧合地与 "Rest in Peace" 形成双关(但并非本意)。
Q20: 如何捐赠支持 ripgrep?
通过 GitHub Sponsors 赞助作者,或向以下组织捐款:
附录:预定义文件类型速查
通过 rg --type-list 查看完整列表。以下是部分常用类型:
| 类型名 | 匹配的文件 |
|---|---|
rust |
*.rs |
py |
*.py |
js |
*.js |
ts |
*.ts |
html |
*.html |
css |
*.css |
c |
*.c, *.h, *.H |
cpp |
*.cpp, *.cc, *.cxx, *.hpp, *.hh, *.hxx |
java |
*.java, *.class |
go |
*.go |
md |
*.md, *.markdown |
json |
*.json |
toml |
*.toml |
yaml |
*.yaml, *.yml |
sh |
*.sh, *.bash, *.zsh |
make |
*.mak, *.mk, GNUmakefile, Makefile |
xml |
*.xml |
svg |
*.svg, *.svgz |
log |
*.log |
lock |
*.lock, package-lock.json |
markdown |
*.md, *.markdown |
pdf |
*.pdf |
文档版本 :基于 ripgrep 15.1.0 (rev af60c2de9d) 官方文档整理
整理日期 :2026-05-01
许可:本文档基于 ripgrep 官方文档,ripgrep 采用 MIT / UNLICENSE 双许可