如何解析 json 格式输出:kubectl get pods using jsonpath

问题描述 投票:0回答:4

如何解析 json 以从

的输出中检索字段
kubectl get pods -o json

从命令行我需要从谷歌云集群获取系统生成的容器名称...以下是上述命令的 json 输出的重要部分: enter image description here

单击此处查看完整的 json 输出

因此,最上面的 json 键是一个数组:items[],后跟metadata.labels.name,其中该复合键的搜索条件值为“web”(参见上图绿色标记)。 在比赛中,我需要检索字段

.items[].metadata.name  

这恰好具有价值:

web-controller-5e6ij   // I need to retrieve this value

这里是 jsonpath 上的文档

我想避免

的文本解析输出
kubectl get pods

这是

NAME                     READY     STATUS    RESTARTS   AGE
mongo-controller-h714w   1/1       Running   0          12m
web-controller-5e6ij     1/1       Running   0          9m

以下将正确解析这个

get pods
命令,但我觉得它太脆弱了

kubectl get pods | tail -1 | cut -d' ' -f1
json parsing google-cloud-platform kubernetes
4个回答
38
投票

经过一番努力,这个班轮确实检索到了集装箱名称:

kubectl get pods -o=jsonpath='{.items[?(@.metadata.labels.name=="web")].metadata.name}'

当这是已知的搜索条件时:

items[].metadata.labels.name  == "web"

这是要检索的所需字段

items[].metadata.name  :  "web-controller-5e6ij"

24
投票

如果你想按标签过滤。您可以只使用

kubectl -l
标志。以下将执行相同的操作:

kubectl get pods -l name=web -o=jsonpath='{.items..metadata.name}'

4
投票

除了 Scott Stensland 的答案之外,还有一种格式化结果的方法:

kubectl get pods -o=jsonpath='{range .items[?(@.metadata.labels.name=="web")]}{.metadata.name}{"\n"}{end}'

这会添加换行符。您还可以执行 {", "} 来输出带空格的逗号。

另一种解决方案:

使用 JQ 获得格式良好的 json 结果:

kubectl get pods -o json | jq -r '.items[] | [filter] | [formatted result]' | jq -s '.'

[过滤器]示例:

select(.metadata.labels.name=="web")

[格式化结果]示例(您可以根据需要添加更多字段):

{name: .metadata.name}

jq -s '.',用于将结果对象放入数组中。

总结一下:

kubectl get pods -o json | jq -r '.items[] | select(.metadata.labels.name=="web") | {name: .metadata.name}' | jq -s '.'

然后就可以使用这个json数据来得到想要的输出结果了。


2
投票

有一个超级简单的方法可以用 jq

来做到这一点

只需使用您已经给出的参数来传输输出即可。

由于您的搜索值位于第二位,请将索引放在括号中。没有给出索引,表示列出所有拟合。

<output> | jq .items[1].metadata.name 

您给出的示例(我已将 -r 用于原始输出,不带引号)

curl -s https://gist.githubusercontent.com/scottstensland/278ce94dc6873aa54e44/raw/b2fc423bc4063a7cd16825f612e19d9a7faf5699/output%2520of%2520kubectl%2520get%2520pods%2520%2520-o%2520json| jq .items[1].metadata.name -r
web-controller-5e6ij
© www.soinside.com 2019 - 2024. All rights reserved.