使用“aws ecs execute-command”处理“aws ecs list-tasks”JSON 输出?

whi*_*ear 1 linux bash shell amazon-web-services amazon-ecs

例如执行此命令。

aws ecs list-tasks --cluster aic-prod
Run Code Online (Sandbox Code Playgroud)

然后它返回下面

{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后使用ae340032378f4155bd2d0eb4ee60b5c7of return 语句执行下一个命令。

aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task ae340032378f4155bd2d0eb4ee60b5c7
Run Code Online (Sandbox Code Playgroud)

我想用一句话或者shell脚本来做这件事情。是否可以?

我用谷歌搜索了正则表达式,但仍然不清楚。

 aws ecs list-tasks --cluster aic-prod | grep taskArns | (regular expression??)
Run Code Online (Sandbox Code Playgroud)

你能提供一些帮助吗?

Joh*_*ica 8

使用 jq 操作 JSON

\n

jq是在 shell 脚本中操作 JSON 的最佳工具。它有一个非常复杂的查询语言。

\n

以下是如何使用它来提取所需的字符串。我已经展示了我一步步构建的查询,以便您可以一次看到一步发生的情况:

\n
\xe2\x9d\xaf aws ecs list-tasks --cluster aic-prod | jq\n{\n  "taskArns": [\n    "arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"\n  ]\n}\n\n\xe2\x9d\xaf aws ecs list-tasks --cluster aic-prod | jq \'.taskArns[0]\'\n"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"\n\n\xe2\x9d\xaf aws ecs list-tasks --cluster aic-prod | jq \'.taskArns[0] | split(":")[-1]\'\n"task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"\n\n\xe2\x9d\xaf aws ecs list-tasks --cluster aic-prod | jq \'.taskArns[0] | split(":")[-1] | split("/")[-1]\'\n"ae340032378f4155bd2d0eb4ee60b5c7"\n
Run Code Online (Sandbox Code Playgroud)\n

使用 $(...) 捕获输出

\n

下一步是添加,-r以便打印不带引号的原始字符串,并用于$(...)捕获输出,以便我们可以在第二个命令中重用它。

\n
task_id=$(aws ecs list-tasks --cluster aic-prod | jq -r \'.taskArns[0] | split(":")[-1] | split("/")[-1]\')\naws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command \'/bin/bash\' --task "$task_id"\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用 xargs

\n

另一种写法是xargs,它获取一个命令的输出并将其作为参数传递给下一个命令。

\n
aws ecs list-tasks --cluster aic-prod |\n    jq -r \'.taskArns[0] | split(":")[-1] | split("/")[-1]\' |\n    xargs aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command \'/bin/bash\' --task\n
Run Code Online (Sandbox Code Playgroud)\n