如何解析 json 格式的输出:kubectl get pods 使用 jsonpath
How to parse json format output of : kubectl get pods using jsonpath
如何解析 json 以从
的输出中检索字段
kubectl get pods -o json
从命令行我需要从 google 云集群中获取系统生成的容器名称...以下是上述命令输出的 json 的重要部分:
click here to see entire json output
所以最上面的 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
以下将正确解析此 get pods
命令,但我觉得它太脆弱
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
你给出的例子(我已经把 -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
除了 Scott Stensland 的回答之外,还有一种格式化结果的方法:
kubectl get pods -o=jsonpath='{range .items[?(@.metadata.labels.name=="web")]}{.metadata.name}{"/n"}'
这会添加换行符。您还可以执行 {", "} 以 space.
输出逗号
另一种解法:
使用 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数据来得到想要的输出结果。
如何解析 json 以从
的输出中检索字段kubectl get pods -o json
从命令行我需要从 google 云集群中获取系统生成的容器名称...以下是上述命令输出的 json 的重要部分:
click here to see entire json output
所以最上面的 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
以下将正确解析此 get pods
命令,但我觉得它太脆弱
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
你给出的例子(我已经把 -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
除了 Scott Stensland 的回答之外,还有一种格式化结果的方法:
kubectl get pods -o=jsonpath='{range .items[?(@.metadata.labels.name=="web")]}{.metadata.name}{"/n"}'
这会添加换行符。您还可以执行 {", "} 以 space.
输出逗号另一种解法:
使用 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数据来得到想要的输出结果。