在Bash中用jq提取AWS的vm-managed-itg*资源并赋值变量
解决AWS Resource Groups Tagging API结合jq提取指定ARN并赋值给Bash变量的问题
错误原因解析
aws resourcegroupstaggingapi get-resources的返回JSON结构顶层是对象,核心资源数据存储在ResourceTagMappingList数组字段中。直接使用jq -r '.[].ResourceARN'会报错,因为顶层并非数组,无法直接遍历提取ResourceARN。
正确命令示例
1. 提取符合条件的ARN
通过jq定位到资源数组,筛选ARN包含vm-managed-itg的条目并提取ARN:
aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm | jq -r '.ResourceTagMappingList[] | select(.ResourceARN | contains("vm-managed-itg")) | .ResourceARN'
.ResourceTagMappingList[]:遍历存储资源信息的数组select(.ResourceARN | contains("vm-managed-itg")):筛选ARN包含指定字符串的资源条目-r:输出无引号的原始字符串,方便后续变量处理
如果需要更精准的正则匹配(比如匹配以vm-managed-itg开头的ARN),可以将contains替换为test:
aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm | jq -r '.ResourceTagMappingList[] | select(.ResourceARN | test("^.*vm-managed-itg.*$")) | .ResourceARN'
2. 赋值给Bash变量
情况1:存储为数组(推荐处理多个ARN)
# 将提取的ARN逐行存入数组 readarray -t ALARM_ARNS < <(aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm | jq -r '.ResourceTagMappingList[] | select(.ResourceARN | contains("vm-managed-itg")) | .ResourceARN') # 验证数组内容 echo "匹配的ARN数量:${#ALARM_ARNS[@]}" for arn in "${ALARM_ARNS[@]}"; do echo "$arn" done
情况2:存储为换行分隔的字符串
# 将提取的ARN存入单个变量(换行分隔) ALARM_ARNS=$(aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm | jq -r '.ResourceTagMappingList[] | select(.ResourceARN | contains("vm-managed-itg")) | .ResourceARN') # 输出结果 echo "$ALARM_ARNS"
内容的提问来源于stack exchange,提问作者gcpdev
相关产品推荐
相关产品推荐

