对于从 aws cli 调用返回到控制台的每一行,我正在尝试获取从 bash 返回的结果。请指教

I'm trying to get results returned from bash for each line returned to console from an aws cli call. Please advise

我正在尝试收集 AWS 区域中的所有实例 (describe-instances),然后为使用第一个命令找到的每个实例从特定 AMI (describe-images) 中提取某些行。我不想先将它转储到文件中。

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 describe-instances --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_",

我基本上是在所有实例中查找 'null'

的 ProductCodeID 或 ProductCodeType

看来您使用了错误的引号。

"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}')

$() 表示您 return 命令的输出作为参数。 " 的意思是引用的是一个很长的参数,这似乎不是你想要的。在您第二次使用 " 时,您希望输出像往常一样打印到控制台,因此您可以完全省略 "。把这些放在一起你会得到:

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 

替代第一个命令使用 --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