首页 > 解决方案 > 用 sed 替换 aws cli 输出中的行

问题描述

我有一个我写的删除 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.
*****************************************************************

我只想删除短语:“调用DescribeSnapshots 操作时发生错误(InvalidSnapshot.NotFound):”并留下短语:快照'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 删除我不想要的部分?

标签: bashsed

解决方案


确保您没有需要转义的字符,即点“。” 但是,可能需要特别注意 sed 搜索字符串中的括号“()”;在这种情况下,似乎不需要搜索大型特定字符串。尝试像这样将其简化并从那里增加字符串的复杂性。这在我的测试中有效,我将文件添加到标准输出,但是如果第二行应该适合您,您的命令可能会发送到标准错误。

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.*: //'

推荐阅读