Jacky's blog
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • Android
  • Web
  • Server
  • Python
  • iOS
  • Java
  • Vue
  • 计算机基础
  • AI
  • 全部工具
  • CLI 工具
  • 编辑器
  • 开发工具
  • 构建工具
  • 版本控制
  • 调试工具
  • 网络工具
  • 个人成长
  • 博客
  • 分类
  • 标签
  • 归档
收藏
GitHub (opens new window)
  • 开发工具

  • 构建工具

  • 版本控制

  • 容器

  • 调试工具

  • 测试工具

  • CLI 工具

    • tmux
    • oh-my-zsh
    • ripgrep 高性能文本搜索工具使用指南
      • 📖 简介
        • 核心特性
        • 性能对比
      • 🚀 安装
        • macOS
        • Ubuntu/Debian
        • CentOS/RHEL
        • 验证安装
      • 📚 基础用法
        • 基本语法
      • 🎯 常用选项详解
        • 1. 大小写敏感
        • 2. 完整单词匹配
        • 3. 反向匹配
        • 4. 统计匹配数量
        • 5. 显示行号
        • 6. 上下文显示
        • 7. 限制结果数量
        • 8. 搜索隐藏文件
        • 9. 忽略 .gitignore
        • 10. 只显示文件名
        • 11. 只显示匹配内容
        • 12. 多行搜索的支持
      • 🎨 文件类型过滤
        • 按文件类型搜索
        • 查看支持的文件类型
        • 自定义文件类型
      • 🔍 使用 glob 模式
        • 基本 glob 用法
        • 多个 glob 组合
      • 🎯 正则表达式搜索
        • 基本正则
        • 捕获组
        • 多行匹配
      • 📊 实战案例
        • 1. 查找所有 TODO 和 FIXME
        • 2. 查找未使用的导入(Python)
        • 3. 查找敏感信息
        • 4. 代码审查
        • 5. 查找大文件中的内容
        • 6. 统计代码行数
        • 7. 查找并替换(预览)
        • 8. 排除特定目录
        • 9. 搜索二进制文件
        • 10. JSON 日志分析
      • ⚙️ 配置文件
        • 创建配置文件
      • 🔧 高级技巧
        • 1. 组合管道使用
        • 2. 与其他工具配合
        • 3. 性能优化
        • 4. 调试搜索
      • 📊 常用选项速查表
      • 🆚 与其他工具对比
        • ripgrep vs grep
        • ripgrep vs ag
      • 💡 最佳实践
        • 1. 智能大小写(--smart-case)
        • 2. 善用配置文件
        • 3. 结合 alias
        • 4. 使用 --stats 分析性能
      • 🔗 参考资源
      • 🎯 总结
    • awk
    • sed
    • xargs
    • fzf
    • fd
    • raycast
    • VisiData 终极生存指南(vd)
    • yq
    • direnv
    • ln 软链接/硬链接使用指南
    • watch 周期监控使用指南
    • osascript
  • 网络工具

  • 编辑器

  • 设计工具

  • 多媒体

  • 包管理

  • 平台工具

  • tools
  • cli_tools
Jacky
2024-06-17
目录

ripgrep 高性能文本搜索工具使用指南

# 📖 简介

ripgrep(简称 rg)是一个高性能的文本搜索工具,专为速度和易用性而设计。它结合了 grep、ag(The Silver Searcher)的优点,并在性能上超越了它们。

# 核心特性

  • ⚡ 速度极快:使用 Rust 编写,多线程并行搜索
  • 🎯 智能过滤:默认忽略 .gitignore、.ignore 文件中的内容
  • 🔍 正则表达式:支持强大的正则表达式搜索
  • 🎨 彩色输出:自动高亮匹配结果
  • 📁 文件类型:内置支持数百种文件类型
  • 🔄 递归搜索:默认递归搜索子目录

# 性能对比

工具 速度 智能过滤 正则支持 推荐度
ripgrep ⭐⭐⭐⭐⭐ ✅ ✅ ⭐⭐⭐⭐⭐
ag ⭐⭐⭐⭐ ✅ ✅ ⭐⭐⭐⭐
grep ⭐⭐⭐ ❌ ✅ ⭐⭐⭐
ack ⭐⭐ ✅ ✅ ⭐⭐

# 🚀 安装

# macOS

brew install ripgrep
1

# Ubuntu/Debian

sudo apt install ripgrep
1

# CentOS/RHEL

sudo yum install ripgrep
1

# 验证安装

rg --version
# 输出:ripgrep 14.1.0
1
2

# 📚 基础用法

# 基本语法

rg [选项] <搜索模式> [路径]

# 使用此命令查看帮助文档
man rg
1
2
3
4

# 🎯 常用选项详解

# 1. 大小写敏感

# 忽略大小写(case-insensitive)
rg -i "error"

# 示例:匹配 Error、ERROR、error
rg -i error log.txt
1
2
3
4
5

# 2. 完整单词匹配

# 只匹配完整单词
rg -w "test"

# ✅ 匹配:test
# ❌ 不匹配:testing、contest
1
2
3
4
5

# 3. 反向匹配

# 显示不包含 "debug" 的行
rg -v "debug"

# 实战:查找所有非注释行(假设注释以 # 开头)
rg -v "^#" config.ini
1
2
3
4
5

# 4. 统计匹配数量

# 只显示每个文件的匹配行数
rg -c "import"

# 输出示例:
# main.py:15
# utils.py:8
# test.py:3
1
2
3
4
5
6
7

# 5. 显示行号

# 显示匹配行的行号(默认仅在输出到终端时开启;管道输出时默认关闭,需显式 -n)
rg -n "function"

# 不显示行号
rg -N "function"
1
2
3
4
5

# 6. 上下文显示

# 显示匹配行前后各 3 行
rg -C 3 "error"

# 只显示前 2 行
rg -B 2 "error"

# 只显示后 2 行
rg -A 2 "error"
1
2
3
4
5
6
7
8

输出示例(rg 输出格式为 路径:行号:内容,上下文行用 - 连接):

src/main.py-10-def process_data():
src/main.py-11-    try:
src/main.py:12:    raise ValueError("error occurred")
src/main.py-13-    except Exception as e:
src/main.py-14-    print(e)
1
2
3
4
5

# 7. 限制结果数量

# 每个文件最多显示 5 个匹配(-m 是简写;注意是按文件限制,不是全局总数)
rg --max-count 5 "TODO"

# 快速检查是否存在:-q 只看退出码(0 = 存在)
rg -q "uid" && echo "found"
1
2
3
4
5

# 8. 搜索隐藏文件

# 包括隐藏文件(如 .env、.gitignore)
rg --hidden "API_KEY"

# 搜索隐藏文件,但仍然遵守 .gitignore
rg --hidden "password"
1
2
3
4
5

# 9. 忽略 .gitignore

# 搜索所有文件,包括被 .gitignore 忽略的
rg --no-ignore "secret"

# 同时搜索隐藏文件和被忽略的文件
rg --hidden --no-ignore "config"
1
2
3
4
5

# 10. 只显示文件名

# 只列出包含匹配的文件名
rg -l "import"

# 输出示例:
# main.py
# utils.py
# test.py
1
2
3
4
5
6
7

# 11. 只显示匹配内容

# 只显示匹配的部分(不显示整行)
rg -o "https?://[^\s]+"

# 示例:提取所有 URL
rg -o "https?://[^\s]+" README.md
1
2
3
4
5

# 12. 多行搜索的支持

# 查找 ApplicationExitInfo 且下一行有 13889 的内容
# -U 是 --multiline 的简写,两者等价,用一个即可
rg -U "ApplicationExitInfo.*\n.*13889" -A 1 <file>
1
2
3

# 🎨 文件类型过滤

# 按文件类型搜索

# 只搜索 Python 文件
rg -t py "import"

# 只搜索 JavaScript/TypeScript 文件
rg -t js -t ts "function"

# 排除 Python 文件
rg -T py "TODO"
1
2
3
4
5
6
7
8

# 查看支持的文件类型

# 列出所有支持的文件类型
rg --type-list

# 输出示例(rg 13.0.0 实测):
# py: *.py
# js: *.js, *.jsx, *.vue
# rust: *.rs
# ...
1
2
3
4
5
6
7
8

# 自定义文件类型

# 添加自定义文件类型
rg --type-add 'custom:*.{foo,bar}' -t custom "pattern"
1
2

# 🔍 使用 glob 模式

# 基本 glob 用法

# 只搜索 .smali 文件
rg 'pattern' --glob '*.smali'

# 只搜索 src 目录下的 .java 文件
rg 'pattern' --glob 'src/**/*.java'

# 排除 test 目录
rg 'pattern' --glob '!test/**'

# 排除所有 .min.js 文件
rg 'pattern' --glob '!*.min.js'
1
2
3
4
5
6
7
8
9
10
11

# 多个 glob 组合

# 搜索 a、b、c 目录下的文件
rg 'pattern' --glob 'a/**' --glob 'b/**' --glob 'c/**'

# 搜索 .js 和 .ts 文件,但排除 node_modules
rg 'pattern' --glob '*.{js,ts}' --glob '!node_modules/**'

# 复杂组合:只搜索 src 下的 .java 文件,排除 test
rg 'pattern' --glob 'src/**/*.java' --glob '!src/**/test/**'
1
2
3
4
5
6
7
8

# 🎯 正则表达式搜索

# 基本正则

# 搜索以 "function" 开头的行
rg "^function"

# 搜索以 ";" 结尾的行
rg ";$"

# 搜索包含数字的行
rg "\d+"

# 搜索邮箱地址
rg "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
1
2
3
4
5
6
7
8
9
10
11

# 捕获组

# 提取版本号
rg "version:\s*(\d+\.\d+\.\d+)" -r '$1'

# 替换匹配内容(不修改文件,只显示)
rg "TODO" -r "DONE"
1
2
3
4
5

# 多行匹配

# -U/--multiline 开启跨行匹配,但 "." 默认仍不匹配换行
# 跨行内容需显式写 \n,或加 (?s) 让 "." 匹配换行

# 示例:匹配跨行注释
rg -U "(?s)/\*.*?\*/"

# 示例:匹配 function 到 } 之间跨行的内容
rg -U "(?s)function.*\{.*\}"
1
2
3
4
5
6
7
8

# 📊 实战案例

# 1. 查找所有 TODO 和 FIXME

rg "(TODO|FIXME|HACK|XXX)" --color always
1

# 2. 查找未使用的导入(Python)

# 找到所有 import 语句
rg "^import|^from .* import" -t py

# 结合其他工具检查是否使用
1
2
3
4

# 3. 查找敏感信息

# 查找可能的密码
rg -i "password\s*=\s*['\"][^'\"]+['\"]" --hidden

# 查找 API 密钥
rg "api[_-]?key" --hidden --no-ignore

# 查找 IP 地址
rg "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
1
2
3
4
5
6
7
8

# 4. 代码审查

# 查找 console.log(应该在生产环境移除)
rg "console\.log" -t js -t ts

# 查找硬编码的 URL(负向先行断言需要 PCRE2 引擎,默认引擎不支持)
rg -P "https?://(?!example\.com)" -t js

# 查找 eval 使用(安全风险)
rg "\beval\(" -t js
1
2
3
4
5
6
7
8

# 5. 查找大文件中的内容

# 在日志文件中查找错误
rg "ERROR|FATAL" --max-count 10 /var/log/app.log

# 查找特定时间段的日志
rg "2024-01-15.*ERROR" /var/log/app.log
1
2
3
4
5

# 6. 统计代码行数

# 统计所有 Python 文件的行数
rg --count-matches ".*" -t py | awk -F: '{sum+=$2} END {print sum}'

# 统计非空行(-c 按行计数;--count-matches 按匹配次数计数,一行多个匹配会重复计数)
rg -c "\S" -t py
1
2
3
4
5

# 7. 查找并替换(预览)

# 预览替换效果(不修改文件)
rg "oldFunction" -r "newFunction" -t js

# 实际替换需要配合 sed 或其他工具
rg -l "oldFunction" -t js | xargs sed -i 's/oldFunction/newFunction/g'
1
2
3
4
5

# 8. 排除特定目录

# 排除 node_modules 和 dist
rg "pattern" --glob '!node_modules/**' --glob '!dist/**'

# 排除所有测试文件
rg "pattern" --glob '!**/*test*'
1
2
3
4
5

# 9. 搜索二进制文件

# 默认跳过二进制文件,强制搜索
rg --text "pattern" binary_file

# 或使用 -a(--text 的简写)
rg -a "pattern" binary_file
1
2
3
4
5

# 10. JSON 日志分析

# 查找包含特定字段的 JSON 行(--json 是把结果输出为 JSON 协议格式,并非搜索 JSON 文件,此处不需要)
rg '"level":"error"' logs.json

# 提取特定字段
rg '"userId":"(\d+)"' -o -r '$1' logs.json
1
2
3
4
5

# ⚙️ 配置文件

# 创建配置文件

ripgrep 默认不读取任何配置文件,只认 $RIPGREP_CONFIG_PATH 环境变量指定的路径(~/.ripgreprc 只是常见命名约定,需自己把环境变量指过去)。

# 创建配置文件
cat > ~/.ripgreprc << 'EOF'
# 默认忽略大小写
--smart-case

# 默认显示行号
--line-number

# 默认显示上下文
--context=2

# 默认排除的目录
--glob=!node_modules/**
--glob=!.git/**
--glob=!dist/**
--glob=!build/**

# 自定义文件类型
--type-add=web:*.{html,css,js,jsx,ts,tsx}
EOF

# 设置环境变量
export RIPGREP_CONFIG_PATH=~/.ripgreprc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 🔧 高级技巧

# 1. 组合管道使用

# 查找并排序
rg "import" -t py | sort

# 查找并统计
rg "TODO" -c | awk -F: '{sum+=$2} END {print "Total TODOs:", sum}'

# 查找并去重
rg -o "https?://[^\s]+" | sort -u
1
2
3
4
5
6
7
8

# 2. 与其他工具配合

# 查找文件并用 vim 打开
vim $(rg -l "TODO" -t py)

# 查找并复制到剪贴板(macOS)
rg "API_KEY" | pbcopy

# 查找并传递给 xargs
rg -l "old_function" | xargs sed -i 's/old_function/new_function/g'
1
2
3
4
5
6
7
8

# 3. 性能优化

# 限制搜索深度
rg "pattern" --max-depth 3

# 使用更多线程(默认自动检测)
rg "pattern" --threads 8

# 禁用 mmap(某些情况下更快)
rg "pattern" --no-mmap
1
2
3
4
5
6
7
8

# 4. 调试搜索

# 显示搜索的文件
rg "pattern" --debug

# 显示匹配统计
rg "pattern" --stats
1
2
3
4
5

# 📊 常用选项速查表

选项 简写 说明 示例
--ignore-case -i 忽略大小写 rg -i error
--word-regexp -w 完整单词匹配 rg -w test
--invert-match -v 反向匹配 rg -v debug
--count -c 统计匹配数 rg -c import
--line-number -n 显示行号 rg -n func
--no-line-number -N 不显示行号 rg -N func
--context -C 上下文行数 rg -C 3 error
--before-context -B 前文行数 rg -B 2 error
--after-context -A 后文行数 rg -A 2 error
--files-with-matches -l 只显示文件名 rg -l TODO
--only-matching -o 只显示匹配部分 rg -o "http.*"
--hidden 搜索隐藏文件 rg --hidden key
--no-ignore 忽略 .gitignore rg --no-ignore
--type -t 指定文件类型 rg -t py import
--type-not -T 排除文件类型 rg -T js TODO
--glob -g 文件名模式 rg -g '*.java'
--max-count -m 限制结果数 rg -m 5 TODO
--replace -r 替换匹配内容 rg TODO -r DONE

# 🆚 与其他工具对比

# ripgrep vs grep

# grep 需要递归选项
grep -r "pattern" .

# ripgrep 默认递归
rg "pattern"

# grep 需要排除目录
grep -r "pattern" --exclude-dir=node_modules .

# ripgrep 自动排除
rg "pattern"  # 自动忽略 .gitignore 中的内容
1
2
3
4
5
6
7
8
9
10
11

# ripgrep vs ag

# 两者用法相似,但 rg 更快
ag "pattern"
rg "pattern"

# rg 支持更多选项
rg "pattern" --stats  # ag 不支持
1
2
3
4
5
6

# 💡 最佳实践

# 1. 智能大小写(--smart-case)

# 默认:区分大小写
rg "error"  # 只匹配 error

# 开启 smart-case:纯小写模式忽略大小写,含大写则精确匹配
rg --smart-case "error"  # 匹配 Error、ERROR、error
rg --smart-case "Error"  # 只匹配 Error
1
2
3
4
5
6

注意:smart-case 不是默认行为,需显式加 --smart-case 或写入配置文件(见「配置文件」一节)。

# 2. 善用配置文件

将常用选项放入 ~/.ripgreprc,避免每次输入。

# 3. 结合 alias

# 添加到 ~/.bashrc 或 ~/.zshrc
alias rgi='rg -i'  # 忽略大小写
alias rgl='rg -l'  # 只显示文件名
alias rgc='rg -C 3'  # 显示上下文
1
2
3
4

# 4. 使用 --stats 分析性能

rg "pattern" --stats
# 输出:
# 15 matches
# 5 files searched
# 0.05 seconds
1
2
3
4
5

# 🔗 参考资源

  • 官方文档 (opens new window)
  • 用户指南 (opens new window)
  • 正则表达式语法 (opens new window)

# 🎯 总结

ripgrep 的核心优势:

  1. ⚡ 速度快:比 grep、ag 快数倍
  2. 🎯 智能:自动忽略不必要的文件
  3. 🔍 强大:支持复杂的正则表达式
  4. 🎨 友好:彩色输出,易于阅读
  5. 🔧 灵活:丰富的选项和配置

推荐使用场景:

  • ✅ 代码搜索和审查
  • ✅ 日志分析
  • ✅ 配置文件查找
  • ✅ 文档搜索
  • ✅ 大型项目快速定位

ripgrep 是现代开发者必备的命令行工具之一!🚀

#Shell#tool#cli
上次更新: 2026/10/18, 22:14:48
oh-my-zsh
awk

← oh-my-zsh awk→

最近更新
01
Codex 使用与会话管理指南
10-17
02
Tailscale 入门:让自己的设备跨网络互联
10-15
03
GitHub CLI(gh)工作流与 CI 排查
10-08
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式