Born Too Late

Yuya's old tech blog.

jq 風に Ruby で JSON をフィルタするツール jr を作った

2014-10-03 03:41:37

最近はログを行指向の JSON として保存するケースが増えていると思います。
今どきは大体どの言語にも標準で JSON のライブラリが入っており、構造化データをログに残す手段として非常に手軽です。
Fluentd の in_tail で吸い上げるために JSON で残しているケースもあるでしょう。

そういった JSON ログをフィルタするツールとしては jq が有名だと思います。
私も日々使っています。

jq は非常に便利なのですが、複雑なフィルタをやろうと思うと、JavaScript 風の jq 独自のシンタックスでいろいろと書く必要があり面倒です。
特に、集計に reduce を使おうとした場合、どうやって書けばいいのかを思い出すのに時間がかかるので、ほとんど使いません。

これが Ruby で書ければ楽なのに...
ということで作りました。

jr: command-line JSON processor for Rubyists

GitHub: yuya-takeyama/jr

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 と組み合わせることもできます。

とても便利なツールなので、是非日常の作業に使ってみてください。
欲しい機能などあれば、プルリクエストもお待ちしています。