Замените строку в выводе aws cli на sed - PullRequest
0 голосов
/ 04 мая 2018

У меня есть скрипт, который я написал, который удаляет снимки AWS. Я хочу удалить часть вывода, когда снимок не существует.

В этом выводе:

Deleting unused snapshots in AWS Gov Non Prod
*****************************************************************
deleting snapshot: snap-0b571b64784bac904

An error occurred (InvalidSnapshot.NotFound) when calling the DeleteSnapshot operation: The snapshot 'snap-0b571b64784bac904' does not exist.
*****************************************************************


*****************************************************************
Verify that snapshot: snap-0b571b64784bac904 is gone:

An error occurred (InvalidSnapshot.NotFound) when calling the DescribeSnapshots operation: The snapshot 'snap-0b571b64784bac904' does not exist.
*****************************************************************

Я хочу удалить только фразу: «Произошла ошибка (InvalidSnapshot.NotFound) при вызове операции DescribeSnapshots:» и оставить фразу: снимок «snap-0b571b64784bac904» не существует.

В своем скрипте я попытался добавить sed, чтобы удалить то, что мне не нужно:

aws ec2 delete-snapshot --snapshot-id=$i --profile=govcloud-nonprod | sed -e 's/An error occurred (InvalidSnapshot.NotFound) when calling the DeleteSnapshot operation: //g'

Это мой сценарий целиком:

    #!/bin/bash

echo "Deleting unattached volumes in AWS Lab"

for i in $(cat aws_lab_volumes.txt)
do
  echo "*****************************************************************"
  echo "deleting volume: $i"
  aws ec2 delete-volume --volume-id=$i --profile=lab | sed -e 's/An error occurred (InvalidVolume.NotFound) when calling the DeleteVolume operation: //g' 2>/dev/null
  echo "*****************************************************************"
  echo; echo; echo; echo; echo
  sleep 5
  echo "*****************************************************************"
  echo "Verify that volume: $i is gone:"
  aws ec2 describe-volumes --volume-ids=$i --profile=lab | sed -e 's/An error occurred (InvalidVolume.NotFound) when calling the DescribeVolumes operation: //g' 2>/dev/null
  echo "*****************************************************************"
  echo; echo; echo; echo; echo
done

Так что, в основном, линия sed не работает. Как я могу использовать sed, чтобы удалить только ту часть, которая мне не нужна?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Убедитесь, что у вас нет персонажа, который требует побега, точка "." и, вероятно, пареням "()" понадобится особое внимание в строке поиска sed, однако; В этом случае, кажется, нет необходимости в больших специфических строках для поиска. Попробуйте сделать это так, чтобы увеличить сложность строк. Это сработало в моих тестах, когда я отправляю файл в stdout, однако ваша команда может отправить в stderr, если так, вторая строка должна работать для вас.

aws ec2 delete-snapshot --snapshot-id=$i --profile=govcloud-nonprod | sed 's/.*DescribeSnapshots.*: //'

aws ec2 delete-snapshot --snapshot-id=$i --profile=govcloud-nonprod 2>&1 | sed 's/.*DescribeSnapshots.*: //'
0 голосов
/ 08 мая 2018

РЕДАКТИРОВАТЬ: удалено первое улучшение, которое использовалось OP.

Эта проблема не должна быть такой сложной, но мы должны попробовать ее небольшими шагами. Вы следовали моему совету, чтобы добавить 2>/dev/null, но написали это не в том месте:

aws ... --profile=lab | sed -e 's/...//g' 2>/dev/null

должно быть

aws ... --profile=lab 2>/dev/null | sed -e 's/...//g' 

Когда это сработает, вам будет не хватать всю строку, так что еще лучше будет

aws ... --profile=lab 2>&1 | sed -e 's/...//g' 

Если это не помогает, попробуйте следующие подходы:

Просмотрите ваш код и то, что вы написали в коде
Пример вывода показывает Deleting unused snapshots in AWS Gov Non Prod, код показывает echo "Deleting unattached volumes in AWS Lab".
Тестируете ли вы тот же файл, который редактировали?

Убедитесь, что #!/bin/bash находится на первой строке без дополнительных пробелов

Отладка с временным файлом
Перенаправьте вывод aws в файл и посмотрите на этот файл.

aws ... --profile=lab > /tmp/aws.out
vi /tmp/aws.out

(смотрите специальные символы, символы табуляции, ..)

Попробуйте простые команды с /tmp/aws.out

sed 's/An error/===/' /tmp/aws.out
sed 's/An error.*: /===/' /tmp/aws.out # something special in the part you try to match
sed 's/ /=/' /tmp/aws.out # Are all white spaces a space ?
sed 's/.*/===/' /tmp/aws.out # Can sed do anything at all or are you missing an EOL 
grep -v "An error" /tmp/aws.out # sed should be fine, but will this remove the complete line?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...