// Windows · 2025-04-14

rga(ripgrep-all)使用指南:轻松搜索所有文件中的内容,让grep不止于文本文件!

在数字工作中,我们常常需要从海量文件中快速提取信息:日志的压缩包、报告的 PDF、备份的 Office 文档……传统工具如 grep 往往局限于纯文本,无法深入二进制内容,导致效率低下,甚至遗漏关键线索。rga(ripgrep-all)正是为此而生。它是 ripgrep(rg)的增强版,能直接搜索压缩包、PDF 和各种格式,速度飞快,堪称命令行搜索神器。


一、初识 rga

什么是 rga?

rga,全称 ripgrep-all,是基于 Rust 编写的开源工具。它扩展了 ripgrep(rg)的功能,后者已是 grep 的高速替代。rg 擅长纯文本多线程搜索,但 rga 通过适配器(如 Pandoc、Poppler)处理复杂格式,将非文本转为可搜文本流,再由 rg 匹配。这套机制让 rga 像“万能钥匙”,无需手动解压或转换,就能直达文件核心。

支持的文件类型极为丰富,涵盖日常到专业场景:

  • 纯文本文件:.txt、.log、.conf、.md 等基础格式,适合日志分析或配置审查。
  • 二进制文档:PDF(.pdf)、DOCX(.docx)、XLSX(.xlsx)、PPTX(.pptx)等 Office 系列;还包括 OpenDocument(.odt、.ods),兼容 LibreOffice 用户。
  • 压缩与归档:ZIP(.zip)、TAR(.tar、.tar.gz)、7Z(.7z)、RAR(.rar),支持递归嵌套达默认 5 层(可调至 10 层),完美处理多层备份。
  • 多媒体与电子书:EPUB(.epub)、FB2(.fb2)等电子书;视频(.mp4、.mkv)的嵌入字幕和元数据;音频(.mp3、.flac)的 ID3 标签,适用于媒体 forensics。
  • 数据库与特殊格式:SQLite(.sqlite、db),直接查询表内容;邮件归档(.mbox、.eml),提取附件文本;HTML(.html)、Jupyter Notebook(.ipynb),支持代码和 Markdown 混合;甚至图像中的 OCR 文本(需额外 Tesseract 配置)。

rga 的核心是“适配器机制”:它调用外部工具(如 pdftotext 提取 PDF、unzip 处理压缩)将内容懒加载为文本流,并智能缓存结果到 SQLite 数据库中。这不仅加速重复查询,还提升了可检视性——你可以用 sqlite3 浏览器查看缓存。举例,在渗透测试中,从服务器 ZIP 备份搜“api_key”时,rga 会递归解压内部配置文件,输出精确行号;在数据恢复场景,从损坏 PDF 提取日志片段,避免完整重建;在代码审查中,扫描整个 Git 仓库的 DOCX 报告,找出“vulnerability”描述。

相比传统工具,rga 的全域覆盖让它脱颖而出:grep 需手动循环文件,findstr(Windows)不支持正则深度,而 rga 一命令搞定,输出格式统一(路径:行号:内容),便于管道处理。

rga 的核心优势

rga 不只是功能堆砌,其工程优化让它在性能和灵活性上领先:

  • 速度极致:继承 rg 的多线程和 SIMD 指令集优化,搜索 GB 级目录仅需秒级;缓存机制确保后续查询零延迟,比标准 grep 快 10-100 倍,尤其在处理大 PDF 或嵌套 ZIP 时。 例如,扫描 1GB 备份只需 2-3 秒,而手动解压可能耗时分钟。
  • 格式兼容无痛:直钻文件内部,使用 MIME 类型检测(--rga-accurate 选项)确保准确,支持 Unicode、UTF-8 和二进制安全。无需预处理,递归档案时自动跳过二进制垃圾。
  • 正则引擎强大:内置 PCRE2,支持复杂模式如捕获组(())、负向前瞻((?!))、边界(\b)和 Unicode 范围(\p{L}),轻松匹配邮箱、IP 或自定义模式。相比 grep 的基本 BRE,rga 的 RE2 更现代。
  • 配置灵活与生态集成:用户配置文件 ~/.config/ripgrep-all/config.jsonc 允许 JSONC 格式自定义适配器、缓存路径和过滤规则。最新 v0.10.9(2024 年 5 月 11 日发布)进一步优化了缓存管理和错误处理,便于团队共享配置。 社区活跃,GitHub 星标超 5k,常有 PR 扩展如新适配器支持。

此外,rga 的跨平台性(Linux/macOS/Windows)和 MIT 许可,确保无缝集成到脚本或 IDE(如 VS Code 的 ripgrep 扩展)。总之,rga 让搜索从“猎豹”变“闪电”,是命令行工作流的必备升级。


二、在 Linux 上安装 rga

安装 rga 简单高效,但依赖关系至关重要。rga 核心依赖 ripgrep(rg),缺失会导致报错如“Could not find executable ‘rg’”。其他运行时依赖包括 pandoc(文档转换)、poppler-utils(PDF 处理)和 ffmpeg(媒体提取),这些若缺席,特定格式搜索将失效或回退到基本文本。

安装步骤(Debian/Kali/Ubuntu)

  1. 更新系统并安装依赖

    sudo apt update && sudo apt upgrade -y
    sudo apt install ripgrep pandoc poppler-utils ffmpeg unzip -y
    • ripgrep:核心引擎,必装。用户示例中,安装前 rga --type pdf "password" -C 3 报错;安装后立即生效,输出如“Page 1: default password of: NewIntelligenceCorpUser9876”,证明依赖链完整。
    • pandoc:转换 Office/EPUB 到文本,支持 Markdown 输出。
    • poppler-utils:提供 pdftotext,提取 PDF 文本层(忽略图像,除非配 OCR)。
    • ffmpeg:处理视频/音频元数据和字幕。
    • unzip:辅助压缩解析(虽 rga 内置,但增强兼容)。
  2. 下载预编译二进制(推荐,静态链接无依赖冲突)
    访问 GitHub Releases 页面:https://github.com/phiresky/ripgrep-all/releases。下载最新 v0.10.9 的 Linux x86_64 包(如 ripgrep-all-v0.10.9-x86_64-unknown-linux-musl.tar.gz),musl 变体更轻量。

  3. 解压并安装

    cd ~/Downloads
    tar -xzf ripgrep-*.tar.gz
    sudo mv ripgrep-*/rga* /usr/local/bin/
  4. 验证安装

    rga --version
    rga --help     # 查看选项

    首次运行会创建 ~/.cache/rga/ 缓存目录(SQLite 格式),加速后续使用。

备选:源码编译(自定义需求)

若需最新开发版或修改源码:

  1. 安装 Rust:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh && source $HOME/.cargo/env(需 >=1.75.0)。
  2. 克隆仓库:git clone https://github.com/phiresky/ripgrep-all.git && cd ripgrep-all。
  3. 构建:cargo build --release。
  4. 安装:sudo cp target/release/rga /usr/local/bin/。

包管理器用户:Arch 用 yay -S ripgrep-all;Fedora dnf install ripgrep-all。安装后,测试 rga "test" /etc/ 搜系统文件,确保无误。


三、rga 基础用法

rga 语法简洁:rga [选项] <模式> [路径]。默认递归当前目录,尊重 .gitignore 和隐藏文件,输出彩色高亮(路径:行号:内容)。这些基础用法覆盖 80% 日常需求,从简单关键词到正则过滤,逐步掌握能取代 grep。

基本搜索

核心是模式匹配,支持字面量和正则。

  • 当前目录搜索关键词:

    rga "password"

    示例输出:

    /home/user/config.txt:5:admin_password=secret123
    /home/user/report.pdf:Page 1:default password: temp123

    自动处理混合格式,速度惊人——1 万文件 <1 秒。

  • 指定路径限定:

    rga "secret" /home/user/project/docs

    避免全盘扫描,聚焦子树;用 . 指当前。

  • 忽略大小写与智能匹配:

    rga -i "password" logs/  # 强制忽略
    rga -s "error"          # 智能:模式全小写时忽略

    实用于日志,如搜“Error”或“error”,输出统一。

  • 多模式 OR 匹配:

    rga "(error|warn|fatal)" /var/log/

    同时捕获级别,输出分类清晰;用 | 分隔。

文件类型过滤

用 --type 精炼搜索,内置 20+ 类型(rga --type-list 查看)。

  • 仅搜索 PDF:

    rga --type pdf "confidential" .

    输出:report.pdf:Page 3:Confidential section starts here...。依赖 poppler-utils,提取文本层。

  • 排除特定类型:

    rga --type-not zip --type-not gz "data" backup/

    跳过压缩,聚焦纯文档;组合用 --type-clear 重置默认。

  • 自定义类型扩展:

    rga --type-add 'custom_logs:*.log,*.txt' "error" /logs/

    添加模式如“.log|.txt”,灵活审计。

  • 类型组合:

    rga --type {pdf,docx} "api" docs/

    并行搜多种,高效多格式。

正则表达式基础

PCRE2 引擎支持高级 RE,远超 grep。

  • 邮箱地址匹配:

    rga "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" /etc/

    捕获:root@localhost 或 user@domain.com,用于凭据审计。

  • IP 地址提取:

    rga "\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log

    边界 \b 确保完整 IP,如“192.168.1.1”,网络流量分析首选。

  • 电话/日期模式:

    rga "\b\d{3}[-.]?\d{3}[-.]?\d{4}\b" contacts.txt  # 电话: 123-456-7890
    rga "\d{4}-\d{2}-\d{2}" reports/                # 日期: 2024-05-11

    自定义如捕获组:rga "ID: (\d+)" | rga -o '\1' 只输出数字。

输出控制

精细化结果,便于阅读/脚本。

  • 仅显示文件名:

    rga -l "key" .  # 输出: config.pdf\nsecrets.txt

    计数:rga -l "key" | wc -l(5 个文件含匹配)。

  • 上下文显示:

    rga -C 3 "error" log.txt  # 前后 3 行

    示例:

    log.txt-3: [INFO] Server started
    log.txt-2: [DEBUG] Loading config
    log.txt-1: [WARN] Minor issue
    log.txt: [ERROR] Connection timeout
    log.txt+1: Retrying in 5s...
    log.txt+2: [INFO] Reconnected
    log.txt+3: End of block

    调试神器,-A/-B 只前后。

  • 分页、高亮与限制:

    rga "todo" | less -R  # 彩色分页
    rga -m 10 "search"    # 最多 10 匹配/文件

    高亮默认启用,终端支持 ANSI。

练习提示:从小目录如 /etc/passwd 开始,渐进到项目仓库,观察缓存生效(第二次搜 <0.1s)。


四、rga 高级用法

基础后,高级技巧解锁 rga 潜力:非文本深度搜、管道链式处理、RE 高级模式与配置调试。重点实战,融入渗透/开发场景。

搜索非文本文件

rga 亮点:二进制透明化。

  • PDF 详细提取:

    rga "admin" report.pdf -C 2

    输出页码+上下文:Page 1: Admin panel access...。若 OCR 需:安装 tesseract-ocr,配置 adapters: { "pdf": ["pdftotext", "tesseract"] }。

  • ZIP/TAR 递归内容:

    rga "flag{" challenge.zip -C 1

    深入嵌套:backup.zip:inner/flag.txt:flag{ctf_secret}。CTF 竞赛利器,默认 5 层;调 --rga-max-archive-recursion 10 处理深档案。

  • Office 文档审计:

    rga "deprecated API" proposal.docx

    Pandoc 转换文本,搜过时函数:Section 2: Use deprecated API v1。支持 XLSX 单元格。

  • SQLite 数据库查询:

    rga "user=admin" users.db -C 5

    表行输出:users_table: id=1, user=admin, hash=sha256。无需 SQL,直搜文本表示。

  • 多媒体元数据:

    rga "title:confidential" evidence.mp4

    FFmpeg 提取:Metadata: title=Confidential Meeting 或 SRT 字幕行。

选项增强:--rga-accurate 用文件头 MIME 判型;--rga-no-mmap 避大文件内存溢出。

管道与自动化集成

rga 输出纯文本,完美管道。

  • 后处理过滤与统计:

    rga "fail" /var/log/ | grep "critical" | sort | uniq -c | sort -nr

    频率表:3 critical fail in auth.log。量化问题规模。

  • 去重与聚合:

    rga "error" . | awk -F: '{print $1}' | sort | uniq -c  # 文件匹配计数
  • JSON 结构化输出:

    rga --json "api_key" . | jq 'select(.type=="match") | {file: .data.path.text, line: .data.line_number}'

    脚本友好:[{"file": "config.json", "line": 42}]。结合 Python 自动化报告。

  • 静默与重定向:

    rga -q "pass" /secrets/ > audit_results.txt  # -q 仅匹配文件输出
    rga "token" | tee console.log | mail -s "Scan Report" admin@team.com
  • 与 find xargs 组合:

    find /var/www -name "*.conf" -o -name "*.env" | xargs rga "db_password" -l

    定向配置搜,曝敏感。

高级正则与模式

  • 负向前瞻/后顾:

    rga "password(?!\s*=\s*null)" configs/  # 排除 =null 的
    rga "(?<=User:\s)\w+" logs/            # 后跟 User: 的词
  • Unicode 与多字节:

    rga "\p{Lu}{1}\p{Ll}+" international.txt  # 大小写词,如 "HelloWorld" 或中文“用户”
  • 替换模拟(非编辑):

    rga -r "old_key:new_key" --dry-run config.txt  # 预览: old_key=val → new_key=val

    安全测试变更。

配置与调试

编辑 ~/.config/ripgrep-all/config.jsonc:

{
  // 缓存路径
  "cache_dir": "/tmp/rga-cache",
  // 启用/禁用适配器
  "adapters": {
    "pdf": true,
    "zip": { "max_recursion": 7 },
    "office": ["pandoc"]
  },
  // 过滤
  "type_glob": { "exclude": ["*.exe", "*.bin"] }
}

重载:重启 shell。调试:RUST_LOG=info rga "test" --debug 输出时序;--rga-list-adapters 列支持;rga --rga-clear-cache 清缓存。

实战扩展:在渗透中 rga "(api_key|bearer_token)" /var/www/ -C 5 --type {conf,env,json},上下文曝硬编码;在 DevOps,rga --type gz "OOMKilled" /var/log/pods/*.gz | wc -l 统计 Kubernetes 崩溃。


五、rga 与 fzf 协作

rga 静态输出高效,但结合 fzf 实现交互探索。rga-fzf 是内置辅助(v0.10+),管道结果到模糊搜索,提升用户体验。

fzf 简介

fzf(fuzzy finder)是 junegunn 的命令行神器,毫秒级模糊匹配、实时预览、多选支持。安装:sudo apt install fzf -y。优势:

  • 算法高效:输入“ps” 匹配“process”,无需精确。
  • 交互丰富:上下键导航、? 切换预览、Ctrl+R 历史。
  • 自定义:键绑定如 Ctrl+T 插入选项。
  • 生态:集成 zsh、vim,跨平台。

单独 fzf 如 ls | fzf 选文件;与 rga 联用,解决“结果洪水”问题。

rga-fzf 原理

工作流:rga 提取匹配 → 管道 fzf 模糊滤 → 交互输出。

  • 原理:rga-fzf 自动 --pretty 格式化(彩色路径),fzf 提供 TUI 界面。
  • 区别表格:
特性 rga rga-fzf
输出 静态列表 动态模糊界面
场景 批量脚本 人工探索/筛选
速度 亚秒提取 毫秒交互
依赖 rga rga + fzf
扩展 管道任意 预览/多选

v0.10.6 起,跨平台二进制内置,提升可用性。

用法示例

  • 基本交互搜索:

    rga-fzf "error"

    界面:输入“crit” 滤“critical error”,上下选,Enter 复制路径到剪贴板,? 预览全文。

  • 凭据渗透审计:

    rga-fzf "password|key|secret|token|bearer"

    模糊“api”,选 ZIP 文件,Ctrl+O 用默认编辑器开(vim),验证硬编码。

  • 压缩包预览:

    rga "flag" *.zip | fzf --preview "rga --pretty -C 3 {q} {}" --preview-window right:50%

    右侧预览高亮上下文,选 Enter 深搜。

  • 多选批量导出:

    rga "TODO|FIXME" src/ | fzf -m --height 40% --preview "bat --color=always -n {}" > tasks.txt

    -m 多选(空格),bat 高亮代码,导出路径列表。

自定义:编辑 ~/.fzf/key-bindings.bash 加 Ctrl+E:bind '"\eE": "export FZF_PREVIEW_COMMAND=\"rga -C 5 {} {q}\""'。开发中 rga-fzf "TODO" 快速定位;在 forensics,交互审疑似文件,效率翻倍。


六、最佳实践与案例

最佳实践

  1. 性能调优:置缓存于 RAM 盘 cache_dir: "/dev/shm/rga-cache";大目录用 --max-filesize 10M 限文件;定期 rga --rga-clear-cache 防膨胀。
  2. 安全与隐私:搜敏感时 --type-not {git,tmp} 避仓库/临时;管道 | head -20 限输出,防泄露;加密缓存需手动配置。
  3. 工作流集成:zsh alias alias sr='rga-fzf';Makefile 目标 audit: rga "vuln" src/ > report.txt;VS Code 设置 "search.searchProgram": "rga" 作为 rg 后端。
  4. 团队协作:Git 共享 config.jsonc,统一如禁用“mail”适配器减负载;CI/CD 中 rga "hardcoded" . -l | xargs rm 自动化清理(慎用)。

故障排除

  • PDF/文档无输出:查依赖 pdftotext --version、pandoc --version;重装或 --rga-no-cache 强制重提取。
  • 搜索缓慢:--rga-no-cache --debug 测瓶颈(如深递归),调 max_recursion 3;大文件用 --no-mmap。
  • 正则语法错:PCRE2 严格,转义如 rga "user\.name|group\.id";测试小文件 echo "test" | rga "pat"。
  • 权限/路径:sudo 搜系统需 sudo rga,但慎;Windows WSL 路径用 /mnt/c/。
  • 缓存损坏:rm -rf ~/.cache/rga/ 重建,SQLite 检视 sqlite3 ~/.cache/rga/index.db "SELECT * FROM cache LIMIT 5;"。

日志调试:RUST_LOG=debug rga "test" 2> debug.log。

实际案例

案例1:CTF 挑战赛
下载 500MB ZIP 备份,rga "flag{" /challenge/ -C 2 --type zip 秒挖嵌套 flag:inner/secrets.txt:flag{rga_rocks}。手动解压需 5 分钟,rga 仅 3 秒,胜在递归 + 缓存。

案例2:服务器日志审计
Kali 上,rga -C 10 "SQL injection| XSS" /var/log/apache/*.gz --type gz 提取攻击上下文:access.log: POST /login: payload=<script>alert(1)</script>。结合管道 | grep -o "IP: \d+\.\d+" 溯源 IP,节省数小时手动 grep。

案例3:代码审查与合规
仓库中,rga --type {docx,pdf,md} "vulnerability|deprecated" docs/ -l 扫描报告:CVE-2024.pdf:Page 15:Deprecated API used。团队用 rga --json | jq 生成 JSON 报告,CI 集成自动警报。

案例4:数据恢复与 forensics
损坏 RAR 档案,rga "recovery_key" evidence.rar --rga-accurate -C 5 提取元数据:manifest.txt:Key=abc123, Timestamp=2024-05-11。结合 fzf 交互选片段,重建事件链。

案例5:DevOps 监控
Kubernetes 日志,rga "OOMKilled|Evicted" /var/log/pods/*.log --type log | sort | uniq -c | sort -nr > oom_report.txt。统计 Top 5 问题 Pod,优化资源分配。

这些案例展示 rga 的普适性:从 hobby 项目到企业级 forensics,均高效。

原文 https://blog.csdn.net/2301_79518550/article/details/146428767