如果没有指定键,如何在JQ中打印给定条件的数组的特定值 [英] How do I print a specific value of an array given a condition in jq if there is no key specified

查看:4
本文介绍了如果没有指定键,如何在JQ中打印给定条件的数组的特定值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用JQ中的regex test()函数输出.metadata.name的值,后跟.spec.template.spec.tainers[].Students[]数组中的学生姓名。

检索单个数组值时遇到问题,因为没有为Students[]数组指定键。

例如,如果我检查Students[]数组是否包含单词&Quot;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, "":	"", .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将其设置为您的regex,例如"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))
      )
  '

这篇关于如果没有指定键,如何在JQ中打印给定条件的数组的特定值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆