如何使用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"
))
'
如果您使用的是 jq 1.6 或更高版本,您可以使用 IN
过滤器简化此操作:
jq '
.manifests |= map(select(
IN(.platform.architecture; "arm64", "amd64")
))
'
输出
{
"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"
}
}
]
}
我想在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"
))
'
如果您使用的是 jq 1.6 或更高版本,您可以使用 IN
过滤器简化此操作:
jq '
.manifests |= map(select(
IN(.platform.architecture; "arm64", "amd64")
))
'
输出
{
"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"
}
}
]
}