日本生まれのスクリプト言語「Ruby」。
RailsをきっかけにWebプログラミングの分野で大きな人気を集めていますが、その他にもシステム管理やテキスト処理用の言語としても広く使われています。
本日紹介する「rb」はそのような用途に便利な、Rubyを他のUNIXコマンドと組み合わせる際に効果を発揮するわずか10行で構成されたスクリプトです。
標準入力から受け取った情報を、Rubyのメソッドを利用して加工し、標準出力に書き出すことが可能で、今までawkやsedなどさまざまなツールを組み合わせる必要があった処理を簡潔に記述することが可能となっています。
rbの使用方法
rbは以下のコマンドによってインストールすることができます。
sudo curl https://raw.githubusercontent.com/thisredone/rb/master/rb -o /usr/local/bin/rb && sudo chmod +x /usr/local/bin/rb
単にスクリプトをダウンロードして実行ビットを立てているだけです。インストールする場所を/usr/local/bin以外に変更したい場合、手動でダウンロードしてコピーすれば良いでしょう。
rbは基本的に標準入力から読み込んだ情報を配列として処理しますが、オプションで「-l」を指定したシングルラインモードでは、標準入力の各行に対して処理を実行します。
例えば「ls -l」の出力を加工する場合を考えます。そのまま実行すると以下のようになります。
$ ls -l total 16 drwxr-xr-x 3 sora staff 102 8 14 22:18 cgi-bin/ -rw-r--r-- 1 sora staff 512 8 14 22:33 index.html -rw-r--r-- 1 sora staff 542 8 14 22:22 test.html
先頭の「total」行を削除したい場合、「drop 1」を指定して配列の先頭要素を削除します。
$ ls -l | rb drop 1 drwxr-xr-x 3 sora staff 102 8 14 22:18 cgi-bin/ -rw-r--r-- 1 sora staff 512 8 14 22:33 index.html -rw-r--r-- 1 sora staff 542 8 14 22:22 test.html
さらにこの各行からファイル名だけを取得したい場合、シングルラインモードでsplitし、最後の要素を取得すれば良いということになります。
$ ls -l | rb drop 1 | rb -l "split[-1]" cgi-bin/ index.html test.html
なぜこうなるの、Ruby開発者の方ならばスクリプト本体を解読してみるのをおすすめします。
#!/usr/bin/env ruby
def execute(_, code)
puts _.instance_eval(&code)
rescue Errno::EPIPE
exit
end
single_line = ARGV[0] == '-l'
expr = ARGV.drop(single_line ? 1 : 0).join(' ')
code = eval("Proc.new { #{expr} }")
single_line ? STDIN.each { |l| execute(l.chomp, code) } : execute(STDIN.readlines, code)
シングルラインモードの場合標準入力の各行の文字列に対してコードが実行され、それ以外の通常モードの場合、読み込んだ標準入力全体が配列に格納されコードが実行されているのがわかります。
まとめ
rbを利用すれば標準入力から受け取った情報を加工して、標準出力に書き出す、いわゆるフィルタ的な処理を簡単に記述することができます。Rubyを普段から使用している方はちょっとした処理が便利にできないか試してみてはいかがでしょうか。