我必须从Kubernetes集群的配置映射中提取符合特定标准的每个数据.我试着和JQ一起做这件事,但我无法克服.

以下是我的K8摘录:

{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "data": {
                "DATA_1": false,
                "DATA_2": "http://my-cluster-dns.my-service:8080",
                "DATA_3": 200
            },
            "kind": "ConfigMap",
            "metadata": {
                "name": "cluster-agent-config",
                "namespace": "my-namespace",
            }
        },
        {
            "apiVersion": "v1",
            "data": {
                "agent-log.yaml": "log-level: INFO\nmax-filesize-mb: 50\nmax-backups: 5\nwrite-to-stdout: true"
            },
            "kind": "ConfigMap",
            "metadata": {
                "name": "cluster-agent-log",
                "namespace": "your-namespace",             
            }
        },
        {
            "apiVersion": "v1",
            "data": {
                "agent-monitoring.yml": "metric-collection-interval-seconds: 30\ncluster-metric-collection-interval-seconds: 60\nmetadata-collection-interval-seconds: 60\ncontainer-registration-batch-size: 5\npod-registration-batch-size: 6\nmetric-upload-retry-count: 2\nmetric-upload-retry-interval-milliseconds: 5\nmax-pods-to-register-count: 750\nmax-pod-logs-tail-lines-count: 500\ninstrumentation-max-polling-attempts: 10\npod-filter: {}\nns-to-monitor-regex: \".*\""
            },
            "kind": "ConfigMap",
            "metadata": {
                "name": "cluster-agent-mon",
                "namespace": "his-namespace",
            }
        },
        {
            "apiVersion": "v1",
            "data": {
                "DATA_1": "http://my-cluster-dns.my-service:9000",
                "DATA_2": "something",
            },
            "kind": "ConfigMap",
            "metadata": {
                "name": "cluster-agent-misc",
                "namespace": "her-namespace",
            }
        }
    ],
    "kind": "List",
    "metadata": {
        "resourceVersion": ""
    }
}

我希望在输出(CSV)中有类似的东西:

my-namespace,cluster-agent-config,DATA_2,http://my-cluster-dns.my-service:8080
her-namespace,cluster-agent-misc,DATA_1,http://my-cluster-dns.my-service:9000

这里的标准是"数据包含以http://my-cluster-dns".开头的URL

我实现了获得我正在寻找的值,但我丢失了其他元数据(以及相应的键)……例如,使用该JQ语句jq -r '.items[].data[] | select(contains("http://my-cluster-dns"))'

或者,我可以获得其他元数据,但过滤器也适用于它们(对于某些标准,这不能满足我的需求),例如这个jq -r '.items[] | . as $item | .data[] | $item.metadata.name, $item.metadata.namespace, . | select(contains("http://my-cluster-dns"))'

最后,我想我接近了:.items[] | . as $item | .data[] | [{ name: $item.metadata.name, namespace: $item.metadata.namespace, value: . }],但我找不到正确过滤的方法.

推荐答案

下面是一种使用to_entries访问键和值并将其存储在变量中以备后用的方法:

.items[] | (
  .data | to_entries[]
  | select(.value | strings | startswith("http://my-cluster-dns"))
) as $data
| [.metadata.namespace, .metadata.name, $data.key, $data.value]
| join(",") # or @csv
my-namespace,cluster-agent-config,DATA_2,http://my-cluster-dns.my-service:8080
her-namespace,cluster-agent-misc,DATA_1,http://my-cluster-dns.my-service:9000

Demo

注:要正确转义(和引用),请使用@csv而不是join(",").

Json相关问答推荐

如何使用Aeson解码带有Unicode字符的JSON文件?

如何创建生成两个不同对象的JSON数组的SQL查询?

当有2个嵌套数组时展平复杂的JSON

如何在Swift中使用JSON编码器的泛型

如何获取 JSON 对象字段值和同一 JSON 对象的下一个数组中的字段值?

将 GEOSwift.JSON 转换为 Swift 中的 struct

如何使用nifi从json文件中过滤属性

如何通过 jolt 将一个对象中的键和值添加到数组中的每个对象中

在 JOLT 中重新排列值

用powershell条件解析json文件的数组对象

如果 JSON 对象包含列表中的子字符串,则丢弃它们

当值包含ansible中的字符串时解析json值

单元测试球衣 Restful Services

在 bash 中将 CSV 转换为 JSON

如何获取json格式的KendoGrid显示数据?

按 JSON 数据类型 postgres 排序

十六进制格式可以与 JSON 文件一起使用吗?如果是这样,怎么做?

强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 组件为零)

在播放框架 JsObject 中解析 Json 数组

从动态 json 数据更新力有向图上的链接