JQ如何按复杂条件拆分/分隔符 解析不同格式K8s资源Kind字符串
JQ拆分Kubernetes API资源标识符方案
完整通用JQ命令如下:
.spec.rules[0].match.resources.kinds[] | split("/") | { group: if length == 3 then .[0] else "" end, version: if length == 3 then .[1] elif length == 2 then .[0] else "" end, kind: if length == 3 then .[2] elif length == 2 then .[1] else .[0] end }
实现逻辑
- 先用
split("/")将每个资源标识符按斜杠拆分为数组 - 基于数组长度自动匹配三种格式做字段提取:
- 数组长度为3:匹配
Group/Version/Kind格式,按顺序提取分组、版本、资源类型 - 数组长度为2:匹配
Version/Kind格式,分组字段留空,提取版本、资源类型 - 数组长度为1:匹配仅
Kind格式,分组和版本字段留空,提取资源类型
- 数组长度为3:匹配
运行效果示例
针对你给出的示例JSON,运行上述命令后输出结果为:
{ "group": "networking.k8s.io", "version": "v1", "kind": "NetworkPolicy" }
变量引用写法
如果你需要将拆分后的字段赋值为变量供后续逻辑使用,可以采用如下写法:
.spec.rules[0].match.resources.kinds[] | split("/") | if length == 3 then .[0] else "" end as $group | if length == 3 then .[1] elif length == 2 then .[0] else "" end as $version | if length == 3 then .[2] elif length == 2 then .[1] else .[0] end as $kind # 后续可直接引用$group、$version、$kind做自定义处理
内容的提问来源于stack exchange,提问作者mifogon
相关产品推荐
相关产品推荐

