JSONをASCIIテーブルで表示する

もともとTSV形式の文字列をASCIIやMarkdown形式のテーブルに変換するコマンドだったnaoty/tableを改善して、JSON形式の文字列を受け取れるようにした。

例えば、以下のようなJSONファイルがあったとする。

// pokemons.json
[
  {
    "id": 1,
    "name": "bulbasaur"
  },
  {
    "id": 2,
    "name": "ivysaur"
  },
  {
    "id": 3,
    "name": "venusaur"
  }
]

このとき、以下のようにパイプでtableコマンドに渡すとASCII形式に変換できる。

$ cat pokemons.json | table -f json:ascii
+----+-----------+
| id | name      |
+----+-----------+
| 1  | bulbasaur |
| 2  | ivysaur   |
| 3  | venusaur  |
+----+-----------+

tableコマンドは出力フォーマットとしてMarkdown形式のテーブルも選べるので、以下のように出力できる。

$ cat pokemons.json | table -f json:markdown
| id | name      |
| -- | --------- |
| 1  | bulbasaur |
| 2  | ivysaur   |
| 3  | venusaur  |

モチベーション

最近、AWSの作業をすることが増えてAWS CLIから返ってくるJSONを扱うことが増えた。返ってきたJSONをjqコマンドで整形して表示するのだけど、件数が増えるとかなり見にくかった。そこで、このような機能を追加してASCIIテーブルとして見やすくしたかったので追加してみた。

例えば、ECSのあるタスク定義に含まれるイメージを知りたいとき、こんな感じでやることになりそう。

$ aws ecs describe-task-definition --task-definition hello_world:8 | \
  jq ".taskDefinition.containerDefinitions | map({name: .name, image: .image})" | \
  table -f json:ascii
+-----------+-----------+
| name      | image     |
+-----------+-----------+
| wordpress | wordpress |
| mysql     | mysql     |
+-----------+-----------+