我在执行 shell 脚本时收到以下错误:(Bash)
An error occurred (InvalidID) when calling the CreateTags operation: The ID ‘{‘ is not valid”
因此,当我查看 shell 脚本时,有两行脚本导致了问题,我发现在我的情况下,第 1 行的输出用作第 2 行的输入(--resource $remote_snapshot_id):
1号线:
remote_snapshot_id=$(aws ec2 copy-snapshot --region us-east-1 --source-region $region --source-snapshot-id $snapshot_id --description $snapshot_id)
2号线:
aws ec2 create-tags --region us-east-1 --resource $remote_snapshot_id --tags Key=CreatedBy,Value=AutomatedBackup
当我尝试在 Linux 终端中将第 1 行作为单个命令执行时:
aws --region us-east-1 ec2 copy-snapshot --source-region us-west-1 --source-snapshot-id snap-00220030300040 --description "Automated_Backup_425"
输出:
{
"SnapshotId": "snap-00880090900090"
}
但第 2 行仅需要第 1 行输出中的值 snap-00880090900090。 (因为它当前正在选择从“{开始的整个输出”,所以它给出了这样的错误,因为它只需要snap-00880090900090)
所以我的问题是我如何 grep snap-00880090900090 并存储该输出以供第 2 行使用(--resource $remote_snapshot_id)
有人可以帮忙解决这个问题吗?
答案1
我如何 grep snap-00880090900090 [来自
{ "SnapshotId": "snap-00880090900090" }
]?
由于您打算从中提取的格式是 JSON,因此最好使用支持 JSON 的工具来完成此操作。jq
如果您可以安装它,我建议您:
command | jq -r .SnapshotId
如果command
输出您提到的 JSON 片段,那么该jq
命令将仅输出snap-00880090900090
(不带引号,或“原始”,这要归功于 option -r
)。
如果您无法安装正确的 JSON 感知工具,可以接受更脆弱的解决方案,并且知道快照 ID 将始终具有示例中所示的形式(“snap-”后跟一系列数字),那么您可以使用 GNU grep 像这样提取它:
command | grep -o 'snap-[0-9]\+'