例如,执行以下命令。
aws ecs list-tasks --cluster aic-prod然后它返回到下面
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
]
}然后使用ae340032378f4155bd2d0eb4ee60b5c7的返回语句执行next命令。
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??)你能帮忙吗?
发布于 2022-08-20 15:22:58
用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' --taskhttps://stackoverflow.com/questions/73427797
复制相似问题