GoでLTSVをJSONに変換できるコマンドラインツールつくった

直近はRubyKaigiだったりでRubyを書くことが多かったのでGoがご無沙汰だったので素振りをするためにGoでLTSVをJSONに変換するコマンドラインツールを作成した

github.com

なんで作ったの?

  • 素振り
  • nginxのログをLTSVで出力してたけどJSONにしてjqで見たかった

使い方

README.mdにも記載している

インストールは go get github.com/hatappi/ltsv2json でも良いし https://github.com/hatappi/ltsv2json/releasesMacOS, Linux用のバイナリを置いている

使い方はシンプル

こんな感じのLTSVフォーマットのファイルを /tmp/fruits.ltsv として用意する

name:grape   num:10
name:apple  num:3
name:banana num:5
name:orange num:2

LTSV2JSONは標準入力とファイル指定どちらも対応している

標準入力

$ cat /tmp/fruits.ltsv | ltsv2json
[{"name":"grape","num":10},{"name":"apple","num":3},{"name":"banana","num":5},{"name":"orange","num":2}]

ファイル指定

$ ltsv2json -i /tmp/fruits.ltsv
[{"name":"grape","num":10},{"name":"apple","num":3},{"name":"banana","num":5},{"name":"orange","num":2}]

後はパイプでjqにつないであげれば、自由に調理できる

# 個数をすべて集計
$ cat /tmp/fruits.ltsv | ltsv2json | jq -c '[.[] | .num] | add'
20

# バナナの個数を表示
$ cat /tmp/fruits.ltsv | ltsv2json | jq -c '.[] | select(.name == "banana") | .num'
5

tail -f みたいな機能

今書いた例は標準入力やファイルを指定してJSONで出力して終わりだけど、tail -fのように新しく追記されたら、それをJSONで出力するようにしたい
LTSV2JSONは-fをつけることでそれが可能になるようにしている

$ ltsv2json -i /tmp/fruits.ltsv -f
{"name":"apple  num:3"}
{"name":"banana num:5"}
{"name":"orange num:2"}

# 別のセッションで追記する
$ echo "name:grape\tnum:10" >> /tmp/fruits.ltsv

# JSONに変換されて出力される
$ ltsv2json -i /tmp/fruits.ltsv -f
{"name":"apple  num:3"}
{"name":"banana num:5"}
{"name":"orange num:2"}
{"name":"grape","num":10}

最後

GoでLTSVをJSONに変換できるコマンドラインツールつくった