如何用jq按条件提取无指定键的数组特定值,适配多Deployment场景?
jq多字段匹配提取方案
Powershell 可用命令
kubectl get deployments -o json | jq -r '.items[] | .metadata.name as $deplName | .spec.template.spec.containers[]?.students[]? | select(test("^Jeff")) | "\($deplName):\t\(.)"'
用你提供的示例JSON执行上述命令,输出结果和你预期的完全一致:
student-deployment: Jefferson
实现逻辑
- 遍历所有Deployment资源时,先将当前Deployment的名称存入
$deplName变量,避免后续遍历子数组时丢失上下文 - 逐层遍历容器数组、学生数组,后缀
?用于兼容部分容器不存在students字段的场景,避免执行报错 - 直接对
students数组的字符串元素做正则匹配,不需要数组元素配置额外键,命中规则的元素会直接返回
问题解答
1. 无键数组是否可以按条件提取特定值?
可以。jq支持直接遍历数组的每一个元素,对元素本身做条件过滤,不需要依赖额外的键。上述方案就是直接对students数组的字符串值做正则匹配,命中的元素会直接输出。
2. 方案是否适配多Deployment场景?
完全适配。存在多个Deployment时,每个Deployment下只要有符合匹配规则的学生,都会单独输出一行对应记录;如果单个Deployment下有多个匹配的学生,也会逐行输出对应的部署名和学生名,不会出现数据混淆或遗漏。
内容的提问来源于stack exchange,提问作者calmmash
相关产品推荐
相关产品推荐

