如果没有指定键,如何在 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 数组。