使用 jq 或 jsonpath 解析 kubectl json 输出

parsing kubectl json output with jq or jsonpath

我想 select,并在

中列出包含“v1beta1”的 crds

.spec.versions.*.name

crd 对象的版本部分类似于这样

    "versions": [
      {
        "name": "v1alpha2",
        "served": true,
        "storage": true,
        "subresources": {
          "status": {}
        },
        "name": "v1beta1"
        "served": true,
        "storage": true,
        "subresources": {
          "status": {}
        }
      }
    ]

我尝试了一些不同的查询,如下所示,但没有成功。

$ kubectl get crd -ojson | jq -r '.items[] | map(select(.spec.versions[] | contains("v1beta1"))).metadata.name'
jq: error (at <stdin>:250345): Cannot index string with string "spec"

Jsonpath 解决方案也很棒。我尝试过类似的方法但没有成功。

$ kubectl get crd -ojsonpath="{range .items.*.spec.versions.*}{.name[?(@=='v1beta1')].metadata.name}{'\n'}{end}"

有人可以帮我吗?

您可以将 jq 解决方案基于:

.spec.versions[] | select(.name | contains("v1beta1"))

或类似的,例如

.spec.versions[] | select(.name | startswith("v1beta1"))

这将使用 jsonpath 显示名称:kubectl get crd -o jsonpath='{range .items[?(@.spec.versions[].name=="v1beta1")].metadata}{.name}{"\n"}'