9行Ruby代码颠覆终端文本处理:rb工具全攻略
引言:告别繁杂命令行工具的痛点
你是否还在为终端中文本处理命令的碎片化而困扰?grep、awk、sed、cut、sort等工具各有语法,记忆成本高且组合复杂。本文将介绍一个仅用9行Ruby代码实现的开源工具——rb,它能替代大部分终端文本处理工具,让你用Ruby语法统一解决各类文本处理任务。
读完本文你将获得:
rb工具的安装与配置方法- 10+实用场景的命令示例
- 自定义扩展与高级用法
- 与传统工具的性能对比分析
什么是rb?
rb是一个轻量级命令行工具,通过Ruby的强大编程能力简化终端文本处理。它将标准输入传递给Ruby代码块执行,使你能够直接在命令行中使用Ruby语法处理文本,避免了学习多种命令行工具的成本。
#!/usr/bin/env ruby
File.join(Dir.home, '.rbrc').tap { |f| load f if File.exist?(f) }
def execute(_, code)
puts _.instance_eval(&code)
rescue Errno::EPIPE
exit
end
single_line = ARGV.delete('-l')
code = eval("Proc.new { #{ARGV.join(' ')} }")
single_line ? STDIN.each { |l| execute(l.chomp, code) } : execute(STDIN.each_line, code)
核心工作原理
安装与配置
快速安装
# 通过GitCode仓库安装
git clone https://gitcode.com/gh_mirrors/rb/rb
cd rb
sudo cp rb /usr/local/bin/
sudo chmod +x /usr/local/bin/rb
# 或直接下载代码创建文件
cat > /usr/local/bin/rb << 'EOF'
#!/usr/bin/env ruby
File.join(Dir.home, '.rbrc').tap { |f| load f if File.exist?(f) }
def execute(_, code)
puts _.instance_eval(&code)
rescue Errno::EPIPE
exit
end
single_line = ARGV.delete('-l')
code = eval("Proc.new { #{ARGV.join(' ')} }")
single_line ? STDIN.each { |l| execute(l.chomp, code) } : execute(STDIN.each_line, code)
EOF
chmod +x /usr/local/bin/rb
环境配置
创建~/.rbrc文件自定义扩展方法:
# ~/.rbrc 示例配置
class String
# 颜色输出方法
def red; "\033[31m#{self}\033[0m" end
def green; "\033[32m#{self}\033[0m" end
# 字符串处理增强
def camel_case
split('_').map(&:capitalize).join
end
end
# 常用工具函数
def timestamp
Time.now.strftime('%Y-%m-%d %H:%M:%S')
end
基础使用方法
命令格式
[输入] | rb [选项] [Ruby代码块]
主要选项:
-l: 单行模式,对输入的每一行单独执行代码块
基础示例
# 简单计算
echo "10" | rb 'to_i * 2' # 输出: 20
# 单行模式处理
echo -e "a\nb\nc" | rb -l 'upcase' # 输出A、B、C(每行一个)
# 数组操作
ls | rb 'sort.reverse' # 反向排序文件列表
实用场景示例
1. 日志分析
# 提取错误日志并高亮显示
tail -f production.log | rb -l '/ERROR/ && self.red'
# 统计状态码分布
cat access.log | rb -l 'split.last' | rb 'tally'
2. Docker容器管理
# 提取运行中的容器镜像
docker ps | rb drop(1) | rb -l 'split[1]'
# 显示退出容器的运行时间
docker ps -a | rb grep(/Exited/) | rb -l 'split.last.ljust(20) + " => " + split(/ {2,}/)[-2]'
输出效果:
angry_hamilton => Exited (0) 18 hours ago
dreamy_lamport => Exited (0) 3 days ago
prickly_hypatia => Exited (0) 2 weeks ago
3. 文件系统分析
# 按文件扩展名统计
find . -type f | rb 'group_by(&File.method(:extname)).map { |ext, o| "#{ext}: #{o.size}" }'
# 查找最大的10个文件
du -h * | rb -l 'split.reverse' | sort -hr | head -10 | rb -l 'split.reverse.join(" ")'
4. 系统监控
# 监控CPU使用率最高的进程
ps aux | rb 'drop(1).sort_by { |l| -l.split[2].to_f }.first(5).unshift(first)'
5. 数据格式化
# CSV转Markdown表格
cat data.csv | rb -l 'split(",").map { |c| "| #{c} " }.join + "|" '
高级用法
与Ruby生态集成
# 使用RubyGems库
echo "https://example.com" | rb 'require "open-uri"; URI.parse(self).read.size'
复杂数据处理
# JSON数据处理
curl https://api.example.com/data | rb 'require "json"; JSON.parse(self)["users"].map { |u| u["name"] }.join("\n")'
性能优化技巧
# 大型文件处理(使用lazy枚举器)
rb -l 'self if /pattern/' large_file.txt # 比grep慢但更灵活
rb 'lazy.select { |l| l.include?("pattern") }.force' large_file.txt # 内存效率更高
与传统工具对比
| 任务 | 传统命令 | rb命令 |
|---|---|---|
| 提取第二列 | awk '{print $2}' | rb -l 'split[1]' |
| 过滤包含关键词行 | grep "error" | rb -l '/error/' |
| 排序 | sort -n | rb 'sort_by(&:to_i)' |
| 去重 | uniq | rb 'uniq' |
| 计数 | wc -l | rb 'count' |
性能对比(100万行文本处理)
虽然rb在纯文本过滤场景比专用工具稍慢,但在复杂逻辑处理时优势明显:
常见问题解决
编码问题
# 处理UTF-8编码
rb 'self.force_encoding("UTF-8")' file.txt
内存占用
# 处理大文件时使用find+rb组合而非全局读取
find . -name "*.log" -exec rb -l '/error/' {} +
安全性考虑
# 避免执行不受信任的代码
# 安全替代方案:使用--safe选项(需自行实现)
总结与展望
rb工具通过将Ruby的强大能力带入终端,为文本处理提供了统一且灵活的解决方案。它特别适合Ruby开发者、需要复杂文本处理的DevOps工程师以及希望减少命令行工具学习成本的用户。
未来发展方向:
- 增加安全沙箱模式
- 预编译常用操作提升性能
- 提供更多内置工具函数
立即尝试rb,用Ruby的力量简化你的终端工作流!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



