You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jq命令中实现单数组与多数组关联并筛选结果

解决jq关联Pod volumes与容器volumeMounts并筛选PVC挂载的问题

核心思路

先将volumes数组转换为以卷名为键的映射对象,再遍历容器的volumeMounts,通过卷名关联对应的卷配置,最后筛选出包含persistentVolumeClaim的挂载项。

示例Pod JSON

{
  "items": [
    {
      "metadata": {
        "name": "test-pod-1"
      },
      "spec": {
        "containers": [
          {
            "name": "app-container",
            "volumeMounts": [
              {
                "name": "pvc-volume",
                "mountPath": "/data"
              },
              {
                "name": "empty-dir",
                "mountPath": "/temp"
              }
            ]
          }
        ],
        "volumes": [
          {
            "name": "pvc-volume",
            "persistentVolumeClaim": {
              "claimName": "test-pvc"
            }
          },
          {
            "name": "empty-dir",
            "emptyDir": {}
          }
        ]
      }
    },
    {
      "metadata": {
        "name": "test-pod-2"
      },
      "spec": {
        "containers": [
          {
            "name": "db-container",
            "volumeMounts": [
              {
                "name": "db-pvc",
                "mountPath": "/var/lib/mysql"
              }
            ]
          }
        ],
        "volumes": [
          {
            "name": "db-pvc",
            "persistentVolumeClaim": {
              "claimName": "db-pvc"
            }
          }
        ]
      }
    }
  ]
}

最终jq命令

jq '.items[] | 
  .metadata.name as $podName | 
  .spec.volumes | map({key:.name, value:.}) | from_entries as $volumeMap | 
  .spec.containers[] | 
  .name as $containerName | 
  .volumeMounts[] as $mount | 
  $volumeMap[$mount.name] | 
  select(has("persistentVolumeClaim")) | 
  {
    pod_name: $podName,
    container_name: $containerName,
    mount_name: .name,
    mount_path: $mount.mountPath
  }' pod.json

命令分步解释

  • .items[]:遍历JSON中所有Pod条目
  • .metadata.name as $podName:将当前Pod的名称存入变量,后续输出复用
  • .spec.volumes | map({key:.name, value:.}) | from_entries as $volumeMap:把volumes数组转成键值对映射,键是卷名,值是完整卷配置,实现快速查找
  • .spec.containers[]:遍历当前Pod下的所有容器
  • .name as $containerName:存入当前容器名称到变量
  • .volumeMounts[] as $mount:遍历当前容器的所有挂载项并保存
  • $volumeMap[$mount.name]:通过挂载项的卷名,从映射中取出对应的卷配置
  • select(has("persistentVolumeClaim")):只保留包含persistentVolumeClaim键的卷配置
  • 最后构造输出对象,包含需要的四个字段

输出结果

{
  "pod_name": "test-pod-1",
  "container_name": "app-container",
  "mount_name": "pvc-volume",
  "mount_path": "/data"
}
{
  "pod_name": "test-pod-2",
  "container_name": "db-container",
  "mount_name": "db-pvc",
  "mount_path": "/var/lib/mysql"
}

内容的提问来源于stack exchange,提问作者user179157

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:05:26