如果没有指定键,如何在jq中打印给定条件的数组的特定值



我试图输出.metadata.name的值,后面跟着学生的名字。spec.template.spec.containers[]。在jq.

中使用正则表达式test()函数的Students[]数组我在检索单个数组值时遇到麻烦,因为没有为students[]数组指定键。

例如,如果我检查student[]数组是否包含单词"Jeff",我希望输出如下所示:

student-deployment:    Jefferson

我已经试过了:

我已经尝试了下面的命令,有些工作,但我不确定如何只获得"杰斐逊"价值。下面的命令将打印出所有的student[]数组值,这不是我想要的。我正在使用Powershell运行下面的命令。

kubectl get deployments -o json | jq -r '.items[] | select(.spec.template.spec.containers[].students[]?|test(""^Jeff."")) | .metadata.name, "":t"", .spec.template.spec.containers[].students'

是否有一种方法可以在jq中打印给定条件的数组的特定值,如果没有指定键?另外,如果有多个部署,解决方案是否有效?

下面的部署模板是json格式,我将其缩短为只包含相关部分。

{
"apiVersion": "v1",
"items": [
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "student-deployment",
"namespace": "default"
},
"spec": {
"template": {
"spec": {
"containers": [
{
"students": [
"Alice",
"Bob",
"Peter",
"Sally",
"Jefferson"
]
}
]
}
}
}
}
]
}

对于这种方法,我们引入一个变量$pattern。您可以将其与--arg pattern设置为您的正则表达式,例如"Jeff""^Al""e$",以通过test过滤学生列表,或将其保留为空以查看所有学生。

现在,我们遍历所有.item[]元素(即遍历"所有部署")。对于每一个发现,我们输出.metadata.name的内容,后面跟着一个文字冒号和一个空格。然后我们再次遍历所有.spec.template.spec.containers[].students[],执行模式test并连接结果。

要输出原始字符串而不是JSON,我们在调用jq时使用-r选项。

kubectl get deployments -o json 
| jq --arg pattern "Jeff" -r '
.items[]
| .metadata.name + ": " + (
.spec.template.spec.containers[].students[]
| select(test($pattern))
)
'

检索"学生";数组,您可以使用以下过滤器:

.items[]
| paths(objects) as $p
| getpath($p)
| select( objects | has("students") )
| .students

您可以添加额外的过滤器来选择感兴趣的特定学生,例如

| .[]
| select(test("Jeff"))

然后添加任何后处理过滤器,例如

| "student-deployment: (.)"

当然,您可以通过许多其他方式获得students数组。

最新更新