jqコマンドでJSONを操作

コマンドラインでJSONを操作するjqコマンドが便利なのでメモ。

まずは俺のUbuntuにインストール。

sudo apt install jq -y

 

1.必要な要素だけ取り出す

例えばAWSのIPアドレス一覧から 東京リージョンのEC2のIPレンジだけ抜き取りたい場合はこうする。

curl https://ip-ranges.amazonaws.com/ip-ranges.json |jq -r '.prefixes[]|select(.region=="ap-northeast-1")|select(.service=="EC2")|.ip_prefix'|sort -n > ip.txt

出力されたip.txtの中身はこうなる。

3.112.0.0/14
13.112.0.0/14
13.230.0.0/15
15.177.79.0/24
15.193.1.0/24
#以下略

何をやってるかというと、ip-ranges.jsonのprefixes要素の中にあるip_prefix要素にIPレンジが入ってる。

これをjqコマンドで取り出して、さらにjqのフィルタ機能を使う。
条件はregionがap-northeast-1で、serviceがEC2というもの。
さらに数値ソートしたものをip.txtに保存する。
 

2.CSVに変換する

CSV変換機能も便利だ。
これまた先のip-ranges.jsonを ip_prefix, region, service, network_border_group の順番ですべてCSV化するならこうだ。

curl https://ip-ranges.amazonaws.com/ip-ranges.json |jq -r '.prefixes[]|[.ip_prefix, .region, .service, .network_border_group]|@csv' > ip.csv

出力されたip.csvの中身はこうなる。

"35.180.0.0/16","eu-west-3","AMAZON","eu-west-3"
"52.94.76.0/22","us-west-2","AMAZON","us-west-2"
"52.95.36.0/22","ap-southeast-2","AMAZON","ap-southeast-2"
"120.52.22.96/27","GLOBAL","AMAZON","GLOBAL"
"150.222.81.0/24","eu-west-1","AMAZON","eu-west-1"

prefixes要素の中身を取り出して、
ip_prefix, region, service, network_border_group の順に配列したものを @csv コマンドでCSVにしている。
jq便利。