jqとcolumnでAWS CLIの出力を見やすく整形する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS CLIを使う上で、JSONパーサjqはとても強力です。
例えば「あるEC2インスタンスが含まれるELBは何と何か」を調べようと思ったら、
$ aws elb describe-load-balancers | \
jq -c '.[][]
| [.LoadBalancerName, .Instances[][]]'
こうして得られた一覧からgrepしてやれば良いですし、
["api-elb","i-2939xxxx","i-0387ba542xxxxyyyy"] ["local-elb","i-b983xxxx","i-e6d0xxxx","i-2939xxxx","i-9477xxxx"] :
「あるRDSパラメータグループを使っているRDSは何か」を調べようと思ったら、
$ aws rds describe-db-instances | \
jq -c '.[][]
| [.DBInstanceIdentifier,
.DBParameterGroups[].DBParameterGroupName]'
としてやれば一覧が手に入ります。
["api-rdb01","db-rds-dbparamgroup01"] ["web-rdb01","default.mysql5.6"] :
EC2インスタンスの名前(Nameタグ)の様に多少複雑な検索が必要なものも、
$ aws ec2 describe-instances | \
jq -c '.[][].Instances[]
| [.InstanceId,
[.Tags[] | select(.Key == "Name").Value][],
.InstanceType]'
jqだけで完結できます。
["i-e6ebxxxx","web-api02-test","t2.small"] ["i-0f8506c19a8c7xxxx","web009","m4.large"] :
ただしこのままだと、 ご覧の通りJSONっぽいフォーマットのままなので、桁が揃っておらずちょっと見にくいです。
jqには CSV や TSV で出力するモードもあるので、そちらを使ってExcelなどに貼り付けるのも手ではありますが、ちょっと確認したいだけであればそれも冗長です。
表示の桁を揃えてくれる column コマンド
なんとかならないかと思って探してみたところ、columnというコマンドの存在を知りました。
column は、入力を複数カラムに分けて整形します。
調べたところ昔からあるコマンドだったのですが、浅学の身でまったく知りませんでした。OSXにも標準でインストールされていました。
せっかくなので早速使ってみます。
ELBとインスタンスIDの一覧:
$ aws elb describe-load-balancers | \
jq -r '.[][]
| [.LoadBalancerName, .Instances[][]]
| @tsv' | \
column -t
api-elb i-2939xxxx i-0387ba542xxxxyyyy local-elb i-b983xxxx i-e6d0xxxx i-2939xxxx i-9477xxxx :
RDSとRDSパラメータグループの一覧:
$ aws rds describe-db-instances | \
jq -r '.[][]
| [.DBInstanceIdentifier,
.DBParameterGroups[].DBParameterGroupName]
| @tsv' | \
column -t
api-rdb01 db-rds-dbparamgroup01 web-rdb01 default.mysql5.6 :
インスタンスIDとインスタンス名、インスタンスタイプの一覧:
$ aws ec2 describe-instances | \
jq -r '.[][].Instances[]
| [.InstanceId,
[.Tags[] | select(.Key == "Name").Value][],
.InstanceType]
| @tsv' | \
column -t
i-e6ebxxxx web-api02-test t2.small i-0f8506c19a8c7xxxx web009 m4.large :
うまい具合に縦の桁をそろえて表示してくれました。
実行にあたっては、
jqのオプションを-c(--compact-output) ではなく-r(--raw-output) にする| @tsvをつける- パイプして
column -tに渡す
といったところがポイントになります。
EC2インスタンスのPublicIpAddressのように、付いていたりいなかったりするものが途中のカラムにあると桁がずれてしまいます。そうなりそうな項目は後ろの方に回すなどの工夫をすると良いでしょう。
参考
jqについてはここでも何度も記事になっています。特に下記の記事は参考にさせてもらいました。
ちなみに
以前下記のようなツールを作った記事を書いたのですが、
同じことをjq+columnでやろうとするとこうなります。
こちらは前述の、空白のカラムが有ると表示が崩れる問題をケアしてみました。
@tsvの代わりに@csvを使い、columnではセパレータに,を使うようにしています。
ここまで複雑になると実用上どうなのという気はしますが、やっぱり、自作のスクリプトを使わずにすむ・メンテが行き届いた汎用コマンドが使えるというのはうれしいですね。








