json の中に含まれる json 文字列を jq で見やすくする

https://stedolan.github.io/jq/jq.png

id:kizashi1122 です。 今日はさらっと Tips を。

aws の ecr のライフサイクルポリシーをコマンドでみたいなと思ったときはこうすると思います。

aws ecr get-lifecycle-policy --repository-name <reponame>

すると json で返ってきます。これを jq でフォーマットするとしたら、

aws ecr get-lifecycle-policy --repository-name <reponame> | jq

とすればよいです。アウトプットは、

{
  "registryId": "<acccount id>",
  "repositoryName": "<reponame>",
  "lifecyclePolicyText": "{\"rules\":[{\"rulePriority\":1,\"description\":\"Keep last 30 images for build\",\"selection\":{\"tagStatus\":\"tagged\",\"tagPrefixList\":[\"foo-\"],\"countType\":\"imageCountMoreThan\",\"countNumber\":30},\"action\":{\"type\":\"expire\"}},{\"rulePriority\":2,\"description\":\"Keep last 30 images for released\",\"selection\":{\"tagStatus\":\"tagged\",\"tagPrefixList\":[\"bar-\"],\"countType\":\"imageCountMoreThan\",\"countNumber\":30},\"action\":{\"type\":\"expire\"}},{\"rulePriority\":3,\"description\":\"Keep last 10 images of untagged\",\"selection\":{\"tagStatus\":\"untagged\",\"countType\":\"imageCountMoreThan\",\"countNumber\":10},\"action\":{\"type\":\"expire\"}}]}",
  "lastEvaluatedAt": "2022-03-07T01:14:24+09:00"
}

こうなります。 lifecyclePolicyText は json の文字列ですがエスケープされまくりで見にくいです。このjsonをフォーマットして見たい場合もあると思います。
どうすればよいでしょう。

こうします。

aws ecr get-lifecycle-policy --repository-name <reponame> | jq '.lifecyclePolicyText' | jq '. | fromjson'

すると意図通り、

{
  "rules": [
    {
      "rulePriority": 1,
      "description": "Keep last 30 images for build",
      "selection": {
        "tagStatus": "tagged",
        "tagPrefixList": [
          "foo-"
        ],
        "countType": "imageCountMoreThan",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    },
    {
      "rulePriority": 2,
      "description": "Keep last 30 images for released",
      "selection": {
        "tagStatus": "tagged",
        "tagPrefixList": [
          "bar-"
        ],
        "countType": "imageCountMoreThan",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    },
    {
      "rulePriority": 3,
      "description": "Keep last 10 images of untagged",
      "selection": {
        "tagStatus": "untagged",
        "countType": "imageCountMoreThan",
        "countNumber": 10
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}

のように表示されます。

見やすいですね!