🧐

awscli --queryオプション vs jqコマンド

2022/10/20に公開

記事の概要

intro

cloudshellでawsリソースの情報を抜いて、出力されたjsonを整形する際

  • awscliに元々ある--queryオプション
  • jqコマンド

の2通りがパッと思い浮かぶと思います。
どちらも同じ結果を得ることは可能なのですが、比較してみようと思います。

比較

CloudFrontのディストリビューションID一覧を表示する という簡単なシチュエーションで
比較をしてみようと思います。
実行環境はCloudShell、awscliバージョンは2.8.3です。

--query の場合

ID取得コマンドの例
aws cloudfront list-distributions --query 'DistributionList.Items[].Id[]'

--query のメリット

実行結果が長すきる場合、勝手にページャービューになってくれる。

パイプでlessコマンドに渡したのと同じ状態になってくれます。
※これはawscli v2に限った話です。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-pagination.html#cli-usage-pagination-clientside

--query のデメリット

最初の行と最後の行にカッコが入ってしまう。

これを回避するために --output text を付けると、今度は改行が失われる。

jq の場合

ID取得コマンドの例
aws cloudfront list-distributions | jq -r ".DistributionList.Items[].Id"

jq のメリット

lengthが使えるので配列の数を数えるのが楽。

個数カウント (jq)
aws cloudfront list-distributions | jq '.DistributionList.Items | length'

これを--queryでやろうとすると
jqでクォーテーションを取ってからwcコマンドなどに渡す必要があり、長くなります。

個数カウント (--query)
aws cloudfront list-distributions --query 'DistributionList.Items[].Id[]' | jq -r "" | awk 'END{print NR}'

※jq -r の部分はもちろんlengthでも良いですが、length思いつく人なら最初からjq単体でやってそう。

jq のデメリット

サーバによってはjqが入っていない

持ってくりゃいいだろと言われればそこまでですが...
強いて挙げられるようなデメリットは見当たりませんでした。

実行速度の差はどうか

少しqueryのが速そう。

jq版
real    0m37.906s
user    0m15.163s
sys     0m0.483s
query版
real    0m34.660s
user    0m7.826s
sys     0m0.184s

outro

jqに軸足を置きつつ、実行コマンドの例をコピペ改変するときのために
--queryも覚えておいて、適宜使い分けるのが良さそうですね。

Discussion