如果没有指定键,如何在 jq 中给定条件打印数组的特定值
How do I print a specific value of an array given a condition in jq if there is no key specified
我正在尝试使用 jq 中的正则表达式 test() 函数在 .spec.template.spec.containers[].students[] 数组中输出 .metadata.name 后跟学生姓名的值。
我无法检索单个数组值,因为没有为 students[] 数组指定键。
例如,如果我检查 students[] 数组是否包含单词“Jeff”,我希望输出显示如下:
student-deployment: Jefferson
我尝试过的:
我已经尝试了下面的命令,但我不确定如何只获取“Jefferson”值。下面的命令将打印出所有 students[] 数组值,这不是我想要的。我正在使用 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
的内容,后跟一个文字冒号和一个 space。然后我们再次遍历所有 .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 感兴趣的特定学生添加额外的过滤器,例如
| .[]
| select(test("Jeff"))
然后添加任何后处理过滤器,例如
| "student-deployment: \(.)"
当然,您可以通过许多其他方式获得 students
数组。
我正在尝试使用 jq 中的正则表达式 test() 函数在 .spec.template.spec.containers[].students[] 数组中输出 .metadata.name 后跟学生姓名的值。
我无法检索单个数组值,因为没有为 students[] 数组指定键。
例如,如果我检查 students[] 数组是否包含单词“Jeff”,我希望输出显示如下:
student-deployment: Jefferson
我尝试过的:
我已经尝试了下面的命令,但我不确定如何只获取“Jefferson”值。下面的命令将打印出所有 students[] 数组值,这不是我想要的。我正在使用 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
的内容,后跟一个文字冒号和一个 space。然后我们再次遍历所有 .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 感兴趣的特定学生添加额外的过滤器,例如
| .[]
| select(test("Jeff"))
然后添加任何后处理过滤器,例如
| "student-deployment: \(.)"
当然,您可以通过许多其他方式获得 students
数组。