我正在尝试收集 AWS 区域中的所有实例(描述实例(,然后为使用第一个命令找到的每个实例从特定 AMI (描述图像(中 grep 某些行。我不想先将其转储到文件中。
for AMI in "aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}'";
do "aws ec2 describe-images --image-ids $AMI |grep '"Name"|ProductCodeId|ProductCodeType'";done
我的语法有什么问题?谢谢!
错误: EC2-user@ip-172-31-20-000:~> ./Get-Instance-Meta.sh ./Get-Instance-Meta.sh:第 4 行:意外令牌附近的语法错误aws'
./Get-Instance-Meta.sh: line 4:
AWS EC2 描述实例 --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}';'
预期的第一个命令输出:
ec2-user@ip-172-31-20-000:~> grep ImageId | aws ec2 describe-instances --region=us-west-2 |grep -o -P 'ami.{0,18}'
ami-02bf6f88fab67448b
ami-0d59109fccbbc4da2
ami-01a80cb1b7a431fb9
ami-0d86f04dd6dfc89df
预期的第二个命令输出:
ec2-user@ip-172-31-20-214:~> aws ec2 describe-images --image-ids ami-01a80cb1b7a431fb9 |grep '"Name"|ProductCodeId|ProductCodeType'
"ProductCodeId": "51luq5gebk3opt7gcvkdrrm89",
"ProductCodeType": "marketplace"
"Name": "OpenSUSE_Leap15.1TaskcatPython3_",
我基本上在所有实例中查找产品代码ID或产品代码类型为"null">
使用 --query 的第一个命令的替代方法:
aws ec2 describe-instances
--region=us-east-1
--query 'Reservations[*].Instances[*].ImageId'
--output text
然后对于for
循环:
AMIs=$(aws ec2 describe-instances
--region=us-east-1
--query 'Reservations[*].Instances[*].ImageId'
--output text)
for AMI in ${AMIs};
do
echo ${AMI}
aws ec2 describe-images
--image-ids ${AMI}
--query 'Images[*].[Name, ProductCodeId, ProductCodeType]'
--output text
done
看起来你用错了引号。
"aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}'"
不执行。您必须使用反引号 '' 或$()
而不是"
来引用您的命令。例如
$(aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}')
$()
意味着将命令的输出作为参数返回。"
的意思是引用的是一个很长的论点,这似乎不是你想要的。在第二次使用"
时,您希望输出像往常一样打印到控制台,因此您可以完全省略"
。把这些放在一起,你会得到:
for AMI in $(aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}');
do aws ec2 describe-images --image-ids $AMI |grep '"Name"|ProductCodeId|ProductCodeType';done