如何使用jsonpath解析:kubectl get pods的json格式输出

如何使用jsonpath解析:kubectl get pods的json格式输出,json,parsing,google-cloud-platform,kubernetes,Json,Parsing,Google Cloud Platform,Kubernetes,如何解析json以从的输出检索字段 kubectl get pods -o json 从命令行中,我需要从google云集群获取系统生成的容器名称。。。下面是上述命令的json输出的突出部分: 因此,最上面的json键是一个数组:items[],后跟metadata.labels.name,其中该复合键的搜索标准值为“web”(见上图绿色标记)。在匹配中,我需要检索字段 .items[].metadata.name 这正好有价值: web-controller-5e6ij //

如何解析json以从的输出检索字段

kubectl get pods -o json
从命令行中,我需要从google云集群获取系统生成的容器名称。。。下面是上述命令的json输出的突出部分:

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

.items[].metadata.name  
这正好有价值:

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

我希望避免对的输出进行文本解析

kubectl get pods
那是

NAME                     READY     STATUS    RESTARTS   AGE
mongo-controller-h714w   1/1       Running   0          12m
web-controller-5e6ij     1/1       Running   0          9m
下面将正确解析这个
getpods
命令,但我觉得它太脆弱了

kubectl get pods | tail -1 | cut -d' ' -f1

经过多次斗争后,这一行确实检索到了容器名称:

kubectl get pods -o=jsonpath='{.items[?(@.metadata.labels.name=="web")].metadata.name}'
当这是已知的搜索条件时:

items[].metadata.labels.name  == "web"
这是需要检索的字段

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

如果要按标签进行筛选。你可以用kubectl-l旗。以下操作也将执行相同的操作:

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


有一种非常简单的方法可以做到这一点

只需使用您已经给出的参数进行输出

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

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

除了Scott Stensland answer,还有一种格式化结果的方法:

kubectl get pods -o=jsonpath='{range .items[?(@.metadata.labels.name=="web")]}{.metadata.name}{"/n"}'
这将添加换行符。您还可以执行{“,“}以输出带有空格的逗号

另一种解决方案:

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

kubectl get pods -o json | jq -r '.items[] | [filter] | [formatted result]' | jq -s '.'
[过滤器]的示例:

select(.metadata.labels.name=="web")
[格式化结果]示例(如果需要,可以添加更多字段):

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

总结一下:

kubectl get pods -o json | jq -r '.items[] | select(.metadata.labels.name=="web") | {name: .metadata.name}' | jq -s '.'
然后,您可以使用此json数据获得所需的输出结果

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