例如,执行此命令。
aws ecs list-tasks --cluster aic-prod
然后它返回到以下
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
]
}
然后使用返回语句的CCD_ 1执行下一个命令。
aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task ae340032378f4155bd2d0eb4ee60b5c7
我想用一句话或shell脚本来完成这件事。有可能吗?
我在谷歌上搜索了一下正则表达式,但仍然不清楚。
aws ecs list-tasks --cluster aic-prod | grep taskArns | (regular expression??)
你能帮忙吗?
使用jq操作JSON
jq是在shell脚本中操作JSON的最佳工具。它有一种非常复杂的查询语言。
以下是如何使用它提取所需的字符串。我展示了我一个接一个构建的查询,这样你就可以一步一步地看到正在发生的事情:
❯ aws ecs list-tasks --cluster aic-prod | jq
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
]
}
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0]'
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0] | split(":")[-1]'
"task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0] | split(":")[-1] | split("/")[-1]'
"ae340032378f4155bd2d0eb4ee60b5c7"
使用$(…(捕获输出
下一步是添加-r
,使其打印不带引号的原始字符串,并使用$(...)
捕获输出,以便我们可以在第二个命令中重用它。
task_id=$(aws ecs list-tasks --cluster aic-prod | jq -r '.taskArns[0] | split(":")[-1] | split("/")[-1]')
aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task "$task_id"
或使用xargs
另一种编写方法是使用xargs
,它接受一个命令的输出,并将其作为参数传递给下一个命令。
aws ecs list-tasks --cluster aic-prod |
jq -r '.taskArns[0] | split(":")[-1] | split("/")[-1]' |
xargs aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task