JSONデータをjqコマンドで整形

  • JSON
  • 最近、AWS CLI を使って RDS のステータスを確認する機会がありました。

    そこで、データを見やすく整形できると業務が捗るなと思い、JSON データを整形する方法を探してみました。

    ちなみに、RDS のステータスは以下のコマンドで確認できますが、めっちゃ情報量が多いです。

    $ aws rds describe-db-instances { "DBInstances": [ { "DBInstanceIdentifier": "database-1-xxxx-instance-1", "DBInstanceClass": "db.t3.medium", "Engine": "aurora-postgresql", "DBInstanceStatus": "available", "MasterUsername": "postgres", "DBName": "xxxxxx", "Endpoint": { "Address": "xxxxx.rds.amazonaws.com", "Port": 5432, "HostedZoneId": "Z29XKXDKYMONMX" }, "AllocatedStorage": 1, "InstanceCreateTime": "2019-10-06T08:32:21.864000+00:00", "PreferredBackupWindow": "03:34-04:04", "BackupRetentionPeriod": 1, "DBSecurityGroups": [], "VpcSecurityGroups": [ { "VpcSecurityGroupId": "sg-00000000000000000", "Status": "active" }, { "VpcSecurityGroupId": "sg-00000000000000000", "Status": "active" } ], "DBParameterGroups": [ { "DBParameterGroupName": "aurora-postgresql-test-db", "ParameterApplyStatus": "in-sync" } ], "AvailabilityZone": "eu-west-1a", ...

    JSONの出力結果をフィルター

    今回の目的は、特定のインスタンスの特定の項目だけチェックしたいときに、どうすればこのJSONファイルを見やすくできるかです。

    フィルターをかける

    特定のDBクラスターに限定したり、特定のDBエンジンに限定することができます。

    $ aws rds describe-db-instances \ | jq '.DBInstances[] | select(.DBClusterIdentifier == "db_cluster_name")'

    〇〇を含むというフィルターもかけられます。以下では postgresql を含むデータベースを検索できます。

    $ aws rds describe-db-instances \ | jq '.DBInstances[] | select(.Engine | contains("postgresql"))'

    結果は長くなってしまうので省略しましたが、これで欲しいリソースにだけ限定することができました。

    続いては、JSONデータを見やすくしていきましょう。

    JSONの出力結果を見やすく整形

    欲しい項目(1個)を抽出します。

    $ aws rds describe-db-instances \ | jq '.DBInstances[].DBInstanceIdentifier' "koizumi-db-01-instance-1" "koizumi-db-01-instance-1-eu-west-1a" "koizumi-postgresql-01" "koizumi-postgresql-02"

    『 -r 』でダブルクオーテーション(")は外しましょう。

    $ aws rds describe-db-instances \ | jq -r '.DBInstances[].DBInstanceIdentifier' koizumi-db-01-instance-1 koizumi-db-01-instance-1-eu-west-1a koizumi-postgresql-01 koizumi-postgresql-02

    欲しい項目(複数個)だけをJSON形式で抽出します。

    $ aws rds describe-db-instances \ | jq '.DBInstances[] | {DB_Instance: .DBInstanceIdentifier, Status: .DBInstanceStatus}' { "DB_Instance": "koizumi-db-01-instance-1", "Status": "stopped" } { "DB_Instance": "koizumi-db-01-instance-1-eu-west-1a", "Status": "stopped" } { "DB_Instance": "koizumi-postgresql-01", "Status": "stopped" } { "DB_Instance": "koizumi-postgresql-02", "Status": "stopped" }

    フィルター & 整形

    最後は、JSON形式のデータに対してフィルターと項目の抽出を同時にやってみたいと思います。

    フィルター条件:Engine に"postgresql"を含む

    抽出項目:DBInstanceIdentifier、DBInstanceStatus

    aws rds describe-db-instances \ | jq '.DBInstances[] | select(.Engine | contains("postgresql")) | {DB_Instance: .DBInstanceIdentifier, Status: .DBInstanceStatus}' { "DB_Instance": "koizumi-postgresql-01", "Status": "stopped" } { "DB_Instance": "koizumi-postgresql-02", "Status": "stopped" }

    今日はここまでです。

  • JSON