Shell脚本中提取manifest.json内us-east-1对应的AMI ID
提取指定区域的AMI ID解决方案
现有manifest.json内容如下:
{ "builds": [ { "name": "golden-image", "builder_type": "amazon-ebs", "build_time": 1689613460, "files": null, "artifact_id": "us-east-1:ami-1234567890abc,us-west-2:ami-0987654321abc", "packer_run_uuid": "test-uuid", "custom_data": null } ] }
当前通过以下命令获取到的AMI_ID变量值为"us-east-1:ami-1234567890abc,us-west-2:ami-0987654321abc":
export AMI_ID=$(cat manifest.json| jq -r '.builds[0].artifact_id')
需求:仅提取us-east-1对应的AMI值,以下是几种可行方案:
方法一:用jq直接解析处理(推荐)
无需先导出AMI_ID变量,直接通过jq的字符串处理能力一步得到目标值:
export US_EAST_1_AMI=$(cat manifest.json | jq -r '.builds[0].artifact_id | split(",")[] | select(startswith("us-east-1:")) | ltrimstr("us-east-1:")')
解释:将artifact_id按逗号拆分后,筛选出以us-east-1:开头的项,再去掉前缀得到纯AMI ID
方法二:基于已有AMI_ID变量处理
如果已经导出了AMI_ID变量,可通过以下shell工具实现提取:
用awk处理
echo "$AMI_ID" | awk -F ',' '{for(i=1;i<=NF;i++) if($i ~ /^us-east-1:/) {sub(/us-east-1:/,"",$i); print $i}}'
用sed处理
echo "$AMI_ID" | sed -n 's/.*us-east-1:\([^,]*\).*/\1/p'
解释:通过正则匹配捕获us-east-1:之后、下一个逗号之前的内容
用grep处理(需支持Perl正则)
echo "$AMI_ID" | grep -oP 'us-east-1:\K[^,]+'
解释:\K用于忽略前面匹配的us-east-1:,仅输出后续到逗号前的内容
内容的提问来源于stack exchange,提问作者CloudEnthusiast
相关产品推荐
相关产品推荐

