用sed替换aws cli输出中的行

时间:2018-05-04 17:11:39

标签: bash sed

我编写了一个删除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删除我不想要的部分?

2 个答案:

答案 0 :(得分:3)

确保你没有需要逃脱的角色,点“。”然而,在sed搜索字符串中,parens“()”可能需要特别注意;在这种情况下,似乎不需要搜索大的特定字符串。尝试将其缩小,并从那里增加字符串的复杂性。这在我的测试中起作用,我将文件写入stdout,但是如果第二行应该为你工作,你的命令可能会发送给stderr。

    <a mat-raised-button
      [routerLink]="['users']">
      <mat-icon >visibility</mat-icon>
      {{user.name}}
    </a>

答案 1 :(得分:2)

编辑:删除了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

(查看特殊字符,TAB字符,..)

使用/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?