如何使用jq命令删除指定的多行字段

how to using jq command to Delete the specified multi-line field

我想在docker

的manifest文件中使用jq命令过滤出我想要的架构
cat manifest.json |jq -r
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1785,
      "digest": "sha256:34860ea294a018d392e61936f19a7862d5e92039d196cac9176da14b2bbd0fe3",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1996,
      "digest": "sha256:93d5f2293f6faf76fc3f2ff30628cf2100b68e3cf16901f39f01d449e67f67d9",
      "platform": {
        "architecture": "arm",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1996,
      "digest": "sha256:a0000b627744766025f552c4db171a00b055d5d709f22aec8be96b6375b220cf",
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1995,
      "digest": "sha256:227c06dc0468dacfcfc04cc0aad3f5138a51bb2afa4d8252c6e83ca39beb8c6f",
      "platform": {
        "architecture": "ppc64le",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1996,
      "digest": "sha256:e7cfbfe13f7a179277f55a835abc0b01f9c6c21892c1ae1b0007f2e09777bca0",
      "platform": {
        "architecture": "s390x",
        "os": "linux"
      }
    }
  ]
}
cat manifest.json |jq -r 'del(.manifests[] |select(.platform.architecture=="arm" and .platform.architecture=="ppc64le"))'

以上命令没有生效。如果我只想在manifest文件中保留amd64和arm64架构,这个命令应该怎么写?

您应该使用 or 而不是 and,因为一个字段只能有这些选项之一(如果有的话),而不能同时有两个。

根据“我只想保留 amd64 和 arm64 架构”,您可以简单地走保留路线,而不是删除:

jq '
  .manifests |= map(select(
    .platform.architecture == "arm64" or .platform.architecture == "amd64"
  ))
'

Demo

如果您使用的是 jq 1.6 或更高版本,您可以使用 IN 过滤器简化此操作:

jq '
  .manifests |= map(select(
    IN(.platform.architecture; "arm64", "amd64")
  ))
'

Demo

输出

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1785,
      "digest": "sha256:34860ea294a018d392e61936f19a7862d5e92039d196cac9176da14b2bbd0fe3",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 1996,
      "digest": "sha256:a0000b627744766025f552c4db171a00b055d5d709f22aec8be96b6375b220cf",
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    }
  ]
}