rbコマンド布教してみる
前口上
ワンライナーですませられる文字列操作をする際、古典的にはawkやsed, Perlを使っていることが多い。いわゆるシェル芸と称されるbashの組み込み機能だけで実現する文字列操作は個々のコマンドの役割が小さいためパイプが長くなってしまいがちで、記法自体にlegacyさが残っており多少のつらみを感じる時もある。
rbコマンドはRubyでワンライナーを実現するための簡単なスニペットであり、pure Rubyさえ知っていれば誰でも使えるので布教してみる。
インストール
rbのGitHubに従う。コマンドの実体は9行のRubyコード
sudo curl https://raw.githubusercontent.com/thisredone/rb/master/rb -o /usr/local/bin/rb && sudo chmod +x /usr/local/bin/rb
使い方
基本はrbに渡すだけで渡したオブジェクトがサポートする任意のRubyメソッドが使える。オプションなしで渡すと文字列の塊が、-l を渡すと行ごとに処理が行われる。 str.reverse
のstr
が省略されているイメージ。
> ls a.md b.md c.md ## まとめて > ls |rb 'reverse' c.md b.md a.md ## 行ごと > ls |rb -l 'reverse' dm.a dm.b dm.c
シンプルなCSV
特定の列を抜く
> cat example.csv id,name,age,sex 1,Taro,17,male 2,Hanako,29,female 3,Ken,35,male 4,Ai,7,female > cat example.csv |rb -l 'split(",")[2]' age 17 29 35 7
csvからヘッダー除去
> cat example.csv |rb 'drop(1)' 1,Taro,17,male 2,Hanako,29,female 3,Ken,35,male 4,Ai,7,female
特定列でソート
> cat example.csv |rb 'drop(1).sort_by{|l| l.split(",")[2].to_i}' 4,Ai,7,female 1,Taro,17,male 2,Hanako,29,female 3,Ken,35,male
Future Work
jsonのツールについても書きたい