Bash条件语句管道输出异常:默认VPC CIDR仍写入文件
解决AWS脚本过滤默认VPC CIDR失效的问题
看起来你遇到了脚本逻辑的小坑——明明想把默认VPC的172.31.0.0/16排除在输出文件外,但它还是悄悄混进去了。咱们一步步拆解问题、修复脚本:
问题根源分析
从你给出的代码片段推测,核心问题大概率出在CIDR的批量处理逻辑上:
- 你可能直接把
aws ec2命令返回的所有CIDR(多值用制表符/空格分隔)当成一个字符串去判断,只有当某个区域恰好只有默认VPC的CIDR时,才会触发过滤;一旦区域里同时存在其他CIDR,整个字符串就不等于172.31.0.0/16,导致所有CIDR(包括默认的)都被写入文件。 - 就算判断逻辑触发,
echo "$describe_cidr" > /dev/null也会把该区域所有CIDR都丢掉,而不是只过滤掉默认的那个。
修复后的完整脚本
下面是调整后的脚本,实现逐个过滤CIDR、精准排除默认VPC网段的需求:
#!/bin/bash OUTPUT_FILE="aws_non_default_cidrs.txt" # 先清空输出文件(避免多次运行内容重复,可选) > "$OUTPUT_FILE" get_cidrs() { # 遍历所有AWS区域(用query直接获取区域名,比cut更可靠) for region in $(aws ec2 describe-regions --output text --query 'Regions[*].RegionName') do echo -e "正在处理区域: '$region'..." # 获取该区域所有VPC的CIDR,转成每行一个的格式,逐个处理 aws ec2 describe-vpcs --region "$region" --query 'Vpcs[*].CidrBlock' --output text | tr '\t' '\n' | while read -r cidr do # 跳过默认VPC的CIDR if [ "$cidr" != "172.31.0.0/16" ]; then echo "$region: $cidr" >> "$OUTPUT_FILE" fi done done } # 执行函数 get_cidrs echo "处理完成!结果已保存到 $OUTPUT_FILE"
关键改进点
- 逐个处理CIDR:用
tr '\t' '\n'把AWS返回的制表符分隔结果转成每行一个CIDR,再通过while read逐个读取判断,确保每个网段都被单独校验。 - 精准过滤:只跳过
172.31.0.0/16,其他网段正常写入文件,不会误删同区域的其他CIDR。 - 更可靠的区域获取:用
--query 'Regions[*].RegionName'直接提取区域名称,避免AWS输出格式变化导致cut -f3失效。 - 添加区域标识:把区域名和CIDR一起写入文件,方便后续溯源哪个区域的网段。
进阶优化(更准确的默认VPC判断)
如果你的目标是过滤默认VPC本身(而非固定CIDR,毕竟有些用户会修改默认VPC的网段),可以直接通过IsDefault属性筛选,不需要额外的if判断:
aws ec2 describe-vpcs --region "$region" --query 'Vpcs[?IsDefault==`false`].CidrBlock' --output text | tr '\t' '\n' >> "$OUTPUT_FILE"
这条命令会直接返回该区域所有非默认VPC的CIDR,逻辑更简洁高效。
内容的提问来源于stack exchange,提问作者dmn0972
相关产品推荐
相关产品推荐

