我正在try 将一个数组与多个数组结合到我的JQ命令中.

这是我的json文档的一个小示例:

{
    "items": [
        {
            "metadata": {
                "name": "pod1"
            },
            "spec": {
                "containers": [
                    {
                        "name": "container1",
                        "volumeMounts": [
                            {
                                "mountPath": "/path1",
                                "name": "mount1"
                            },
                            {
                                "mountPath": "/path2",
                                "name": "mount2"
                            }
                        ]
                    },
                    {
                        "name": "container2",
                        "volumeMounts": [
                            {
                                "mountPath": "/path3",
                                "name": "mount1"
                            }
                        ]
                    }
                ],
                "volumes": [
                    {
                        "name": "mount1",
                        "persistentVolumeClaim": {
                            "claimName": "claim1"
                        }
                    },
                    {
                        "name": "mount2",
                        "emptyDir": {}
                    }
                ]
            }
        }
    ]
}

我想输出所有Pod的名称、它的容器和容器挂载点的名称,最后只 Select 其卷具有密钥persistentVolumeClaim的挂载,例如:

pod1;container1;mount1;/path1;claim1
pod1;container2;mount1;/path3;claim1

到目前为止,我能够提取Pod-name、tainer-name以及挂载名称和路径:

jq -r '.items[]
    | {pod:.metadata.name, c:.spec.containers[]}
    | {pod:.pod, container:.c.name, mount:.c.volumeMounts[]}
    | [.pod, .container, .mount.name, .mount.mountPath]
    | join(";")'

这将提供以下输出:

pod1;container1;mount1;/path1
pod1;container1;mount2;/path2
pod1;container2;mount1;/path3

现在,我需要将volumes数组与containers中的每个volumeMounts数组联接,然后只为那些具有persistentVolumeClaim键的数组 Select .我让它可以联接两个数组,但我无法在上面的命令中集成它来联接volumes和上面命令中containers个数组中的每个volumesMounts:

jq -r '.items[]
    | .spec.containers[].volumeMounts+.spec.volumes
    | group_by(.name)
    | map(add)
    | .[]
    | select(.persistentVolumeClaim)'

推荐答案

下面是一个解决方案,它 for each 项目构建一个索引,然后将数据转换为 struct 化对象,最后创建一个要连接的数组:

.items[]
| INDEX(.spec.volumes[]; .name) as $index
| { pod: .metadata.name }
+ (
    .spec.containers[]
    | {
        container: .name,
        mount: JOIN($index; .volumeMounts[]; .name; {name: first.name, path: first.mountPath, claim: .[1].persistentVolumeClaim.claimName})
    } | select(.mount.claim)
)
| [ .pod, .container, .mount[] ]
| join(";")

输出:

pod1;container1;mount1;/path1;claim1
pod1;container2;mount1;/path3;claim1

Json相关问答推荐

如何让jq输出长数据集?

时间和日期数据绘制不正确

Jolt需要将缺少的值设置为空并保持相同的位置

无法从MongoDB集合中检索正确的文档

Oracle plsql:如何将json文件加载到嵌套表中

合并2个嵌套词典

(已回答)JSON 读取函数返回未定义而不是预期值 - Typescript

Spark-SQL中的from_unixtime函数未能给出正确的输出

jq - 将父键值提取为子元素旁边的逗号分隔值

将来自 Golang 的 JSON API 调用响应输出到 nextjs 前端

Powershell v7 文本背景突出显示

用于遮蔽卡的 Jolt 规格

如何使用 ConfigurationBuilder 解析现有的 json 字符串(不是文件)

如何删除 django jsonfield 中的特定项目

将 JSON 数据导入 Google 表格

没有默认构造函数的杰克逊第 3 方类

Spring Security 和 JSON 身份验证

关于使用 $ref 的 JSON 模式

Jackson JSON序列化,通过级别定义避免递归

如何在 Python 中合并两个 json 字符串?