jq regex匹配异常:AWS ECR镜像标签筛选问题排查
解决AWS ECR镜像标签筛选与提取的jq脚本问题
问题排查
原脚本存在三个核心问题:
- 筛选逻辑错误:
select( .tag | contains(["prod-build"]))中,contains作用于数组时是检查数组是否完全包含指定元素,而非检查数组内元素是否包含目标子串。这导致本该被过滤的events-test-build-340镜像被错误保留,同时无法正确识别含prod-build的生产镜像。 - 标签处理方式错误:
.tag[] |= walk(...)会遍历数组每个元素并将不匹配规则的元素转为null,而非直接移除不符合项,最终输出中出现无效null值和不符合规则的标签。 - 字段名不匹配:原脚本将
imagePushedAt重命名为date_pushed,与期望输出的字段名不一致。
正确实现脚本
cat ecr-describe-images-events.json | jq ' .imageDetails[] | select(any(.imageTags[]; contains("prod-build"))) | { tag: (.imageTags[] | select(match("^[^-]+$"))) | [.], sha: .imageDigest, imagePushedAt: .imagePushedAt } '
脚本逻辑说明
- 遍历
imageDetails中的每个镜像条目 - 用
any(.imageTags[]; contains("prod-build"))精准筛选出标签包含prod-build子串的生产部署镜像 - 构造输出对象:
tag字段:过滤出imageTags中完全不含短横线的标签,并用[...]包裹为数组格式sha直接提取镜像的imageDigest值imagePushedAt保留原字段名,与期望输出一致
验证结果
针对提供的输入数据,执行脚本后会得到正确输出:
{ "tag": ["6debaabc26cc82a4011ea9c71854cebac7a57250"], "sha": "sha256:0fae259bcfe02c8cf0ec3746aae668b3166960e7119467496df9aedfbc2c8c5b", "imagePushedAt": "2020-12-21T03:11:52-05:00" }
内容的提问来源于stack exchange,提问作者Tom Harrison
相关产品推荐
相关产品推荐

