ruby用一行代码实现linux命令

本文介绍如何使用Ruby语言实现grep、find、sed、awk等命令的功能,包括处理文件搜索、注释、行号添加及数据解析等常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、linux的grep:

ruby -ne 'puts $_ if $_ =~ /foo/' /usr/share/dic/words

-n 选项相当于在-e指定的代码外边包上一层 while gets ... end
$_表示当前行
在多个文件搜索:

ruby -ne 'puts $_ if $_ =~ /foo/' /user/share/dic/*

如果你想显示匹配的行,文件,以及行号,可以这么做:

ruby -ne 'printf("%s\tin file:%s\tline %d\n",$_.strip,$<.filename,$.) if $_ =~ /foo/' /user/share/dic/*

二、find命令:
shell命令:

find . -type f -exec test -s {}/..data/log \; -print

ruby:

ruby -e 'Dir["**/**"].each{|f| p f if File.ftype(f) == "file" and File.size("#{f}/..data/log") > 0 }'

三、sed命令:
1、处理注释:
所有代码注释掉:

ruby -pe '$_ = "#" + $_' test.rb

这个只会在命令行输入,我们想覆盖原来的文件,我们可以用shell的重定向来实现:

ruby -pe '$_ = "#" + $_' test.rb > test.rb

但是这个不适合处理多个文件,ruby有一个选项可以做这个事情,就是-i选项:

ruby -i -pe '$_ = "#" + $_' test.rb

如果我们还想同时备份原文件,那么可以这么做:

ruby -i.bak -pe '$_ = "#" + $_' test.rb

这样原来的文件会备份为test.rb.bak
我们想把文件中所有注释行都去掉:

ruby -i.bak -ne 'puts $_ unless $_ =~/^#/' *.rb

2、使用行号:
我们想给每一行加上行号:

ruby -i.bak -ne 'puts $_ = $. + ": " + $_' file1

这样一个记录:
zhangsan 12 175
lisi 22 178
每行字段以tab键分割。
把每一行的放到一个文件中:

ruby -ne 'open("/tmp/test/user_#{$.}","w"){|f| f.puts $_}' user_info

四、awk的功能:
我们想对上面的程序每个字段一行存放,我们可以使用-a自动分割选项:

ruby -a -ne 'open('/tmp/test/user_#{$.}","w"){|f| f.puts $F }' user_info

同样是上面的记录,但是以,分割
我们想交换第一和第二字段:

ruby -a -F, -i -ne 'puts $F.values_at(1,0,2).join("\t") user_info

可以使用-F指定分割
五、ls功能:
在当前目录下列出所有大小大于1k的所有c语言源文件,并按照修改时间排序:

ruby -e 'puts Dir["*.c"].find{|f| File.size(f) > 1024}.sort{|f1,f2| File.mtime(f1) <=> File.mtime(f2)}'

可以使用Array的sort_by来做:

ruby -e 'puts Dir["*.c"].find{|f| Fle.size(f) > 1024}.sort_by{|f| File.mtime(f)}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值