Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • shell

  • tool

    • mac
    • mac tool
    • c tool
    • platform
    • dev tool
    • java tool
    • IDEA
    • vscode
    • Docker 使用指南
    • unbuntuOnWindows
    • oh-my-zsh
    • github
    • lldb
    • ripgrep 高性能文本搜索工具使用指南
      • 📖 简介
        • 核心特性
        • 性能对比
      • 🚀 安装
        • macOS
        • Ubuntu/Debian
        • CentOS/RHEL
        • 验证安装
      • 📚 基础用法
        • 基本语法
        • 最简单的搜索
      • 🎯 常用选项详解
        • 1. 大小写敏感
        • 2. 完整单词匹配
        • 3. 反向匹配
        • 4. 统计匹配数量
        • 5. 显示行号
        • 6. 上下文显示
        • 7. 限制结果数量
        • 8. 搜索隐藏文件
        • 9. 忽略 .gitignore
        • 10. 只显示文件名
        • 11. 只显示匹配内容
      • 🎨 文件类型过滤
        • 按文件类型搜索
        • 查看支持的文件类型
        • 自定义文件类型
      • 🔍 使用 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. 使用智能大小写
        • 2. 善用配置文件
        • 3. 结合 alias
        • 4. 使用 --stats 分析性能
      • 🔗 参考资源
      • 🎯 总结
    • appium
    • mvn
    • ffmpeg
    • gradle
    • git 使用指南
    • jenv
    • php-fpm
    • raycast
    • Vim 编辑器入门指南
    • jadx
    • excalidraw
  • 网络

  • algo

  • compute_base

  • blog

  • growth

  • java

  • C&C++

  • ai

  • secure

  • cms

  • english

  • 生活

  • 金融学

  • more

  • other
  • tool
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 [选项] <搜索模式> [路径]
1

# 最简单的搜索

# 在当前目录递归搜索 "TODO"
rg TODO

# 在指定目录搜索
rg TODO /path/to/project

# 在指定文件搜索
rg TODO file.txt
1
2
3
4
5
6
7
8

输出示例:

src/main.rs
12:    // TODO: 优化性能
45:    // TODO: 添加错误处理

docs/README.md
8:## TODO
1
2
3
4
5
6

# 🎯 常用选项详解

# 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. 显示行号

# 显示匹配行的行号(默认开启)
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

输出示例:

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

# 7. 限制结果数量

# 只显示前 5 个匹配
rg --max-count 5 "TODO"

# 找到 1 个结果就停止(快速检查是否存在)
rg --max-count 1 "uid"
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

# 🎨 文件类型过滤

# 按文件类型搜索

# 只搜索 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

# 输出示例:
# py: *.py, *.pyi
# js: *.js, *.jsx, *.mjs
# 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 选项)
rg -U "function.*\{.*\}" --multiline

# 示例:匹配多行注释
rg -U "/\*.*?\*/" --multiline
1
2
3
4
5

# 📊 实战案例

# 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
rg "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}'

# 统计非空行
rg --count-matches "\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 行
rg '"level":"error"' --json logs.json

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

# ⚙️ 配置文件

# 创建配置文件

ripgrep 会读取 ~/.ripgreprc 或 $RIPGREP_CONFIG_PATH 指定的配置文件。

# 创建配置文件
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. 使用智能大小写

# 小写模式:忽略大小写
rg "error"  # 匹配 Error、ERROR、error

# 包含大写:精确匹配
rg "Error"  # 只匹配 Error
1
2
3
4
5

# 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
上次更新: 2025/10/19, 17:40:23
lldb
appium

← lldb appium→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式