如何进行高效搜索(ripgrep)?


前言

作为一名开发者,相信大家在用idea检索项目关键信息时,都会通过快捷键ctrl + shift + f来快速检索关键信息。但是如果给出6000个key,在项目中检索是否使用过这些key,我们如何做才会更高效呢?下面给出一种解决方案。


一、ripgrep文本搜索工具

ripgrep

ripgrep(简称rg)是一个用Rust编写的现代化命令行搜索工具,它结合了传统grep的可靠性和现代工具的智能优化,它能在当前目录中递归搜索正则表达式模式。它因其卓越的性能和对开发者友好的默认设置,能够胜任大部分检索场景。

下面这个表格概括了ripgrep的一些核心特性和价值点:

特性维度核心要点带给你的价值
🚀 极致性能并行处理、智能忽略(默认遵守.gitignore,跳过隐藏/二进制文件)、内存映射。在大型代码库或文件系统中,搜索速度通常远超传统工具。
🛠️ 开箱即用默认递归搜索、高亮显示、遵循.gitignore、自动跳过隐藏文件/目录和二进制文件。大部分场景下,你无需额外配置,就能获得干净、相关的搜索结果。
🔤 强大 Unicode 支持完全支持Unicode。能正确处理多语言文本。
📁 智能文件处理按文件类型过滤(-t)、排除特定文件(–glob)、支持搜索压缩文件(-z)。精准定位搜索范围,提升效率。
🎨 清晰展示默认彩色高亮、显示行号和文件名。搜索结果一目了然。

使用方法:

  1. 安装与配置

各主要Linux发行版的安装方法:
Debian/Ubuntu:

sudo apt install ripgrep

CentOS/RHEL:

sudo yum install ripgrep

Arch Linux:

pacman -S ripgrep

配置文件:
ripgrep支持通过配置文件自定义默认选项。创建 ~/.ripgreprc 文件,添加常用设置:ripgrep支持通过配置文件自定义默认选项。创建 ~/.ripgreprc 文件,添加常用设置:

# 始终启用彩色显示
--color=always

# 添加自定义文件类型
--type-add 'web:*.{html,css,js}'

# 忽略大小写
--ignore-case
  1. 基本用法

简单搜索:

# 在文件中搜索模式
rg "search_pattern" /path/to/file

# 在当前目录及子目录中递归搜索
rg "pattern" /path/to/directory

常用选项:

  • 递归搜索:-r或–recursive(默认启用)。
  • 忽略大小写:-i或–ignore-case。
  • 显示行号:-n或–line-number。
  • 固定字符串搜索:-F或–fixed-strings,禁用正则表达式特殊字符处理。
  • 反向匹配:-v或–invert-match,显示不匹配模式的行。

正则表达式支持:
ripgrep支持强大的PCRE2正则表达式,例如:

# 搜索多个模式之一
rg "error|warning" /var/log/syslog

# 使用字符类
rg "[A-Z]+_SUSPEND" linux/kernel/

高级功能:
上下文显示:查看匹配项的周围内容有助于理解上下文。

# 显示匹配行及其前后2行
rg "error" -C 2

# 显示匹配后的行
rg "error" -A 3

# 显示匹配前的行
rg "error" -B 1

文件类型过滤:ripgrep内置对多种文件类型的识别。

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

# 排除JavaScript文件
rg -Tjs "function"

# 查看支持的文件类型
rg --type-list

高级搜索选项:

# 多线程搜索(指定4个线程)
rg -j 4 "TODO"

# 在压缩文件中搜索
rg -z "error" logbackup.gz

# 搜索二进制文件
rg -a "magic_string" binaryfile.bin

统计与输出控制:

# 显示搜索统计信息
rg "pattern" --stats

# 仅显示匹配部分,而非整行
rg -o "pattern"

# 自定义输出格式,替换匹配文本
rg "error" --replace "ERROR"

二、使用递归搜索:-r或–recursive(默认启用)

#!/bin/bash

# 设置路径
PROPERTIES_FILE="/path/to/your/properties/file.properties"
PROJECT_DIR="/path/to/your/project"
# 输出结果文件路径
OUTPUT_FILE="key_usage_result.txt"

echo "正在从 properties 文件提取 keys..."

# 清空输出文件
> "$OUTPUT_FILE"

count=0
# 从 properties 文件提取 keys
while IFS='=' read -r key value; do
    # 跳过空行和注释行
    [[ -z "$key" || "$key" =~ ^[[:space:]]*# ]] && continue
    
    # 去除 key 的前后空格
    key=$(echo "$key" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    
    ((count++))
    if (( count % 100 == 0 )); then
        echo "已处理 $count 个 keys..."
    fi
    
    # 使用 ripgrep 搜索五种形式的 key,这里采用正则表达式模糊查询的方式,检索项目中的以下几种文件:*.java,*.sql,*.js,*.json,*.yml,*.yaml。将结果key=true/false输出到$OUTPUT_FILE文件中。
    # 1. 双引号包围: "key"
    # 2. 单引号包围: 'key'
    # 3. i18n前缀形式: "i18n.key"
    # 4. YAML列表项形式: - key
    # 5. 键值对形式: key:
    if rg -q -g "*.java" -g "*.sql" -g "*.js" -g "*.json" -g "*.yml" -g "*.yaml" -- "(\"$key\")|('$key')|(\"i18n\.$key\")|(- $key)|($key:)" "$PROJECT_DIR"; then
        echo "$key=true" >> "$OUTPUT_FILE"
    else
        echo "$key=false" >> "$OUTPUT_FILE"
    fi
done < "$PROPERTIES_FILE"

echo "检查完成!"
echo "结果保存在 $OUTPUT_FILE"

经过实测,6000多的key在项目中检索时间在25分钟左右,如果想提高脚本执行速度,我们可以充分利用多核处理器的性能并行处理(parallel),下面给出并行的版本,这个我没有测试过性能,感兴趣的小伙伴可以试试。

#!/bin/bash

PROPERTIES_FILE="/path/to/your/properties/file.properties"
PROJECT_DIR="/path/to/your/project"
OUTPUT_FILE="key_usage_result.txt"

echo "正在从 properties 文件提取 keys..."

# 提取所有 keys 到临时文件
TEMP_KEYS_FILE=$(mktemp)
grep -v '^[[:space:]]*#' "$PROPERTIES_FILE" | grep '=' | cut -d'=' -f1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' > "$TEMP_KEYS_FILE"

# 清空输出文件
> "$OUTPUT_FILE"

echo "开始并行检查 keys..."

# 使用 parallel 并行处理
cat "$TEMP_KEYS_FILE" | parallel -j 8 '
    key={}
    if rg -q -g "*.java" -g "*.sql" -g "*.js" -g "*.json" -g "*.yml" -g "*.yaml" -- "(\"$key\")|('"'"'$key'"'"')|(\"i18n\.$key\")|(- $key)|($key:)" '"$PROJECT_DIR"'; then
        echo "$key=true"
    else
        echo "$key=false"
    fi
' >> "$OUTPUT_FILE"

# 清理临时文件
rm "$TEMP_KEYS_FILE"

echo "检查完成!"
echo "结果保存在 $OUTPUT_FILE"

📚 场景总结

  • 日常代码搜索:利用其速度和默认忽略无关文件的特性,在项目中快速导航。
  • 日志分析:结合 -C 查看错误上下文,–stats 统计错误出现频率。
  • 代码重构:使用 -n 显示行号精确定位,-w 进行全词匹配。
  • 配置文件管理:利用 -t 按类型搜索配置文件,或用 –glob 聚焦特定目录。

ripgrep通过其出色的性能和人性化的默认设置,确实能显著提升你在命令行下搜索文本的效率。刚开始你可能会记得几个常用选项,多用几次就会越来越顺手。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值