実用rubyワンライナー


なぜrubyワンライナーか

要約すると日々の業務で発生する雑な文字列処理をやっつけるのにrubyめっちゃ便利

なぜワンライナーが必要か

1MBやら1GBある文字列を雑に処理したいときってのは結構存在する
例えば、ログやメディアの解析データ、gitコマンドの出力等に「hogeの出現間隔って最小どれくらい?」みたいな調査を行いたいことがある

そういったとき背筋を伸ばしてエディタ立ち上げてpython書くのも良いが、いかんせん怠いしめんどいし遅い

出来ればググる速度で結果を出したい
そういったとき、シェルコマンドを駆使してコマンドラインに直接ゴリゴリ書いていくワンライナーが効力を発揮する

rubyワンライナーで何ができるか

主に文字列処理。他にもいろいろできるが、今回は割愛する

なぜ文字列処理をrubyでワンライナーを行うか

rubyのメリットにこの辺がある

  • -e-nなどワンライナーに便利なオプション
  • 強力な正規表現
  • 数値処理もできる
  • each_with_objecteach_consなど魅力的な関数がある
  • rubyを使ってるユーザはそれなりにいる
  • まぁそれなりにいろんな環境に入っている

どうやってrubyワンライナーを使えばよいか

個人的によく使うパターン2つと、たまに使う機能と、一応知ってるけどめったに使わない機能を紹介する

個人的によく使うパターン

ruby -e 'ARGF.hoge'

コマンドライン引数で指定されたファイルや標準入力をゴリゴリ処理するパターン。
集積処理やeach_consで2要素間の値取りたい場合などで良く使う

example1
# 1000までの3が付く数字の合計
$ seq -f "value=%g" 1000 | grep "3" | \
ruby -e 'p ARGF.map{|s| s=~/value=(\d+)/;$1.to_i}.sum()'
コマンドライン 説明
ruby rubyコマンド
-e オプション 引数として受け取った文字列をrubyコンマドとして実行する
出てくる単語 説明
ARGF コマンドライン引数で指定されたファイル OR 標準入力を表す ファイルオブジェクト
rubyの勉強してくれ

ruby -nle '$_ =~ /hoge/ and $1.to_i < fuga and print piyo'

コマンドライン引数で指定されたファイルや標準入力から1行ずつとりだし、処理を行う
要するに高級なsedやawk

example
# ptsの下1桁が0なフレームを出力
ffprobe test.mp4 -show_packets -select_streams a 2>/dev/null | \
ruby -nle '$_ =~ /pts=(\d+)/ and $1.to_i % 10 ==0 and print $1.to_i'
コマンドライン 説明
ruby rubyコマンド
-n オプション sedやawkのように「1行ごとに読み出し-eオプションの引数を適用する」ようになる(※1)
-l オプション 入出力の改行をいい感じに処理する。具体的には$_ に格納する値をchompする+print時末尾に改行を挿入する
-e オプション 引数として受け取った文字列をrubyコンマドとして実行する
出てくる単語 説明
and && と大体同じ。ただし、演算子の優先順位が非常に低い
$_ -nオプションによって割り当てられる(※1)

(※1)もう少し正確な挙動について
-nオプションを使用すると下のように展開される。
getsはARGFから1行ずつ文字列を読み出し、変数 $_ に格納される
詳細: https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html#cmd_option

while gets
 ${eオプションの引数}
end

たまに使う機能

コマンドラインオプション

オプション名 使用頻度 説明
-r feature 割と使う require。モジュールの読み込み
-a 割と使う awkモード。-n オプションと一緒に使う。 $F$_.splitの結果が代入される
-p 自分は使わないけど他の人は使ってるっぽい -nの機能に加え、最後に print $_を行うようになる
-i [extension] まれに便利 sedの-iなどと同じ。コマンドライン引数で指定されたファイルに標準出力の内容を書き込む。extensionを指定するとbackupを残しておける

-nで自動定義される変数

変数名 使用頻度 説明
$. まれに便利 現在の行番号

あるのは知ってるけどあまり使ってない機能

コマンドラインオプション

変数名 使用頻度 説明
-0 perlで使ったことがある -nオプションで読み込む際に\n以外の文字で区切れるようになる。実用上は空行区切りにするのに使う

その他

キーワード 説明
BEGIN,END awkのBEGIN ENDと同じ(参考)
条件式における hoge..fuga flop flopとか呼ばれるもの。どうもdeprecatedぽいので説明は省略 (参考)

参考