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

ripgrep(简称rg)是一个用Rust编写的现代化命令行搜索工具,它结合了传统grep的可靠性和现代工具的智能优化,它能在当前目录中递归搜索正则表达式模式。它因其卓越的性能和对开发者友好的默认设置,能够胜任大部分检索场景。
下面这个表格概括了ripgrep的一些核心特性和价值点:
| 特性维度 | 核心要点 | 带给你的价值 |
|---|---|---|
| 🚀 极致性能 | 并行处理、智能忽略(默认遵守.gitignore,跳过隐藏/二进制文件)、内存映射。 | 在大型代码库或文件系统中,搜索速度通常远超传统工具。 |
| 🛠️ 开箱即用 | 默认递归搜索、高亮显示、遵循.gitignore、自动跳过隐藏文件/目录和二进制文件。 | 大部分场景下,你无需额外配置,就能获得干净、相关的搜索结果。 |
| 🔤 强大 Unicode 支持 | 完全支持Unicode。 | 能正确处理多语言文本。 |
| 📁 智能文件处理 | 按文件类型过滤(-t)、排除特定文件(–glob)、支持搜索压缩文件(-z)。 | 精准定位搜索范围,提升效率。 |
| 🎨 清晰展示 | 默认彩色高亮、显示行号和文件名。 | 搜索结果一目了然。 |
使用方法:
- 安装与配置
各主要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
- 基本用法
简单搜索:
# 在文件中搜索模式
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通过其出色的性能和人性化的默认设置,确实能显著提升你在命令行下搜索文本的效率。刚开始你可能会记得几个常用选项,多用几次就会越来越顺手。
3028

被折叠的 条评论
为什么被折叠?



