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