我试图输出.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
数组。