在jq中,获取当前项的索引(类似于Python的枚举())?



我正在学习Kubernetes教程,并使用jq来过滤kubectl的一些详尽输出。

即将出现的一个任务是使用kubectl get pods显示哪些映像部署到哪些pod。到目前为止,我有这个:

kubectl get pods -o json | jq '.items[]|[.metadata.name,.spec.containers[].image]'

这会得到像这样的输出:

[
"kubernetes-bootcamp-5485cc6795-4blsd",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]
[
"kubernetes-bootcamp-5485cc6795-k824z",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]

这很好,但是如果我很好奇,想要查看关于特定pod的更多信息,我需要在.items数组中使用它的索引。在总共只有两个项目的情况下,这很好,但我认为Kubernetes生产集群可能有数千个项目。有什么方法可以在输出中包含项目的索引吗?换句话说,我想看到:

[
0,
"kubernetes-bootcamp-5485cc6795-4blsd",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]
[
1,
"kubernetes-bootcamp-5485cc6795-k824z",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]

我曾尝试在数组构造函数中使用path(.),但它只是导致空数组而不是该项目的路径。我一直在阅读jq手册页,但到目前为止,我被难住了。任何帮助将不胜感激!

示例数据下面是kubectl的一个片段,可以用来重现我问题中的输出。

{
"items": [
{
"metadata": {
"name": "kubernetes-bootcamp-5485cc6795-4blsd"
},
"spec": {
"containers": [
{
"image": "gcr.io/google-samples/kubernetes-bootcamp:v1"
}
]
}
},
{
"metadata": {
"name": "kubernetes-bootcamp-5485cc6795-k824z"
},
"spec": {
"containers": [
{
"image": "gcr.io/google-samples/kubernetes-bootcamp:v1"
}
]
}
}
]
}

如果您将其保存到output.json,例如,您可以使用命令

重现我的问题
cat output.json | jq '.items[]|[.metadata.name,.spec.containers[].image]' 

您可以使用to_entries过滤器(请参阅手册),它将对象转换为包含每个字段的键和值的对象数组。但是,如果应用于数组,则数组的下标将用作键:

.items | to_entries[]
{
"key": 0,
"value": ...
}
{
"key": 1,
"value": ...
}
因此,只需像以前一样创建输出,但要记住.key.value:
.items | to_entries[] | [.key, .value.metadata.name, .value.spec.containers[].image]
# or
.items | to_entries[] | [.key, (.value | .metadata.name, .spec.containers[].image)]
[
0,
"kubernetes-bootcamp-5485cc6795-4blsd",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]
[
1,
"kubernetes-bootcamp-5485cc6795-k824z",
"gcr.io/google-samples/kubernetes-bootcamp:v1"
]

您可以创建一个索引变量,例如:

range(0; .items|length) as $i | .items[$i] | [$i, .metadata.name, .spec.containers[].image]

或者,您可以定义一个通用的enumerate函数并按如下方式使用它:

def enumerate(s): foreach s as $x (-1; .+1; [., $x]);
enumerate(.items[] | [.metadata.name, .spec.containers[].image]) | [first] + last

最新更新