Я пытаюсь получить результаты, возвращаемые из bash для каждой строки, возвращаемой на консоль из вызова aws cli. пожалуйста, порекомендуйте

Я пытаюсь собрать все экземпляры в регионе AWS (описать-экземпляры), а затем выделить определенные строки из конкретных AMI (описать-изображения) для каждого экземпляра, найденного с помощью первой команды. Я не хочу сначала выгружать его в файл.

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- экземпляры --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_",

Я в основном просматриваю все экземпляры для ProductCodeID или ProductCodeType со значением 'null'


person Kevin Ayres    schedule 12.06.2020    source источник


Ответы (2)


Альтернатива вашей первой команде с использованием - запрос:

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 
person Marcin    schedule 12.06.2020

Похоже, вы использовали неправильные кавычки.

"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 
person gmatht    schedule 12.06.2020
comment
Благодарю. Я перепробовал все их комбинации. Разумная ошибка при непредвиденном токене aws `для INSTANCE в aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P ami.{0,18} do aws ec2 describe-images --image-ids $INSTANCE |grep .Name.\|ProductCodeId\|ProductCodeType done ' - person Kevin Ayres; 12.06.2020