jq 風に Ruby で JSON をフィルタするツール jr を作った
最近はログを行指向の JSON として保存するケースが増えていると思います。
今どきは大体どの言語にも標準で JSON のライブラリが入っており、構造化データをログに残す手段として非常に手軽です。
Fluentd の in_tail で吸い上げるために JSON で残しているケースもあるでしょう。
そういった JSON ログをフィルタするツールとしては jq が有名だと思います。
私も日々使っています。
jq は非常に便利なのですが、複雑なフィルタをやろうと思うと、JavaScript 風の jq 独自のシンタックスでいろいろと書く必要があり面倒です。
特に、集計に reduce を使おうとした場合、どうやって書けばいいのかを思い出すのに時間がかかるので、ほとんど使いません。
これが Ruby で書ければ楽なのに...
ということで作りました。
jr: command-line JSON processor for Rubyists
jr は JSON をフィルタ・集計するためのコマンドラインツールで、Ruby で記述できます。
実際にフィルタしたり集計したりする例は GitHub の README を参照してください。
GitHub API でリポジトリ一覧から必要な情報だけ抜き出したり、言語ごとにリポジトリ数を集計したりしています。
昼休みに思いついて、プロトタイプとして作った reduce-json というツールを元にしています。
JSON のストリームを Ruby で reduce するコマンド書いた
元々は reduce メソッドだけを実行できるものでしたが、せっかくだから map や find_all なんかもできた方がいいよね、ということで今の形になりました。
インストール方法
gem にしているので以下のようにインストールできます。
gem install jr-cli
jr の良いところ
jr は、jq がそうであるように、他のツールと組み合わせて使うことを目指しています。
UNIX 標準のツールと組み合わせるには、CSV 等の行指向のフォーマットに変換できる必要があって、それは未対応ですが、そのうちできればと思ってます。
jq と組み合わせることもできます。
とても便利なツールなので、是非日常の作業に使ってみてください。
欲しい機能などあれば、プルリクエストもお待ちしています。