首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jq过滤和保持原有的json结构

使用jq过滤和保持原有的json结构
EN

Stack Overflow用户
提问于 2022-03-10 23:16:20
回答 1查看 307关注 0票数 1

我有一个json结构,它包含了kubectl - jsonpath='{.spec.template.metadata.annotations}的注释列表。

代码语言:javascript
复制
{
  "kubectl.kubernetes.io/restartedAt": "2022-03-09T16:09:47-08:00",
  "sidecar.istio.io/proxyCPU": "100m",
  "sidecar.istio.io/proxyCPULimit": "2",
  "sidecar.istio.io/proxyMemory": "128Mi",
  "sidecar.istio.io/proxyMemoryLimit": "1Gi",
  "traffic.sidecar.istio.io/excludeOutboundPorts": "8200",
  "vault.hashicorp.com/agent-cache-enable": "true",
  "vault.hashicorp.com/agent-cache-use-auto-auth-token": "force",
  "vault.hashicorp.com/agent-init-first": "true",
  "vault.hashicorp.com/agent-inject": "true",
  "vault.hashicorp.com/ca-cert": "/run/secrets/kubernetes.io/serviceaccount/ca.crt",
  "vault.hashicorp.com/preserve-secret-case": "true",
  "vault.hashicorp.com/role": "my-role",
  "vault.hashicorp.com/secret-volume-path-a": "/var/path",
  "vault.hashicorp.com/secret-volume-path-b": "/var/path",
  "vault.hashicorp.com/secret-volume-path-c": "/var/path",
  "vault.hashicorp.com/secret-volume-path-d": "/var/path",
  "vault.hashicorp.com/secret-volume-path-e": "/var/path"
}

我希望使用jq只获取包含“储藏室”的键,因此输出应该是:

代码语言:javascript
复制
{
  "vault.hashicorp.com/agent-cache-enable": "true",
  "vault.hashicorp.com/agent-cache-use-auto-auth-token": "force",
  "vault.hashicorp.com/agent-init-first": "true",
  "vault.hashicorp.com/agent-inject": "true",
  "vault.hashicorp.com/ca-cert": "/run/secrets/kubernetes.io/serviceaccount/ca.crt",
  "vault.hashicorp.com/preserve-secret-case": "true",
  "vault.hashicorp.com/role": "my-role",
  "vault.hashicorp.com/secret-volume-path-a": "/var/path",
  "vault.hashicorp.com/secret-volume-path-b": "/var/path",
  "vault.hashicorp.com/secret-volume-path-c": "/var/path",
  "vault.hashicorp.com/secret-volume-path-d": "/var/path",
  "vault.hashicorp.com/secret-volume-path-e": "/var/path"
}

我试过用这样的方法

代码语言:javascript
复制
$ kubectl get deployment test -n test -o jsonpath='{.spec.template.metadata.annotations}' |jq '. | to_entries[] | select(.key | startswith("vault"))'

{
  "key": "vault.hashicorp.com/agent-cache-enable",
  "value": "true"
}
{
  "key": "vault.hashicorp.com/agent-cache-use-auto-auth-token",
  "value": "force"
}

但我不知道如何将输出转换回原来的json格式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-10 23:22:30

to_entries将对象解构为键值对数组.使用map(…)可以在不分解数组的情况下修改其项,并使用from_entries从修改后的数组重构原始对象:

代码语言:javascript
复制
… | jq 'to_entries | map(select(.key | startswith("vault"))) | from_entries'

或者使用with_entries(…),这是to_entries | map(…) | from_entries的内置快捷方式。

代码语言:javascript
复制
… | jq 'with_entries(select(.key | startswith("vault")))'
代码语言:javascript
复制
{
  "vault.hashicorp.com/agent-cache-enable": "true",
  "vault.hashicorp.com/agent-cache-use-auto-auth-token": "force",
  "vault.hashicorp.com/agent-init-first": "true",
  "vault.hashicorp.com/agent-inject": "true",
  "vault.hashicorp.com/ca-cert": "/run/secrets/kubernetes.io/serviceaccount/ca.crt",
  "vault.hashicorp.com/preserve-secret-case": "true",
  "vault.hashicorp.com/role": "my-role",
  "vault.hashicorp.com/secret-volume-path-a": "/var/path",
  "vault.hashicorp.com/secret-volume-path-b": "/var/path",
  "vault.hashicorp.com/secret-volume-path-c": "/var/path",
  "vault.hashicorp.com/secret-volume-path-d": "/var/path",
  "vault.hashicorp.com/secret-volume-path-e": "/var/path"
}

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71431880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档