jq 键,每个 shell 脚本的值

0 shell foreach amazon-web-services jq

我试图使用输出的每个键、值并将其通过管道传输到另一个命令。这是我正在尝试使用的:

INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID"
Run Code Online (Sandbox Code Playgroud)

通过上述命令,我得到以下输出:

{
"Tags": [
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "A-VALUE",
        "Key": "A-KEY"
    },
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "B-VALUE",
        "Key": "B-KEY"
    },
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "C-VALUE",
        "Key": "C-KEY"
    },
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "D-VALUE",
        "Key": "D-KEY"
    },
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "E-VALUE",
        "Key": "E-KEY"
    },
    {
        "ResourceType": "instance",
        "ResourceId": "i-0342a609edf80001a",
        "Value": "F-VALUE",
        "Key": "G-KEY"
    },
    {
Run Code Online (Sandbox Code Playgroud)

现在我想将每个 Key,Value 通过管道传输到以下命令:

aws ec2 create-tags --resources XXXXX --tags Key=H-KEY,Value=H-VALUE
Run Code Online (Sandbox Code Playgroud)

其中Key、Value的数量和值是可变的。所以我相信我需要一个“为每个人”。

你可以帮我吗?

就像:对于每个键、值,执行以下操作:

aws ec2 create-tags --resources XXXXX --tags Key=A-KEY,Value=A-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=B-KEY,Value=B-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=C-KEY,Value=C-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=N...-KEY,Value=N...-VALUE
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

有一个@sh指令来输出为 shell 正确引用的值:

aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \
| jq -r '.Tags[] | @sh "aws ec2 create-tags --resources XXXXX --tags Key=\(.Key),Value=\(.Value)"' 
Run Code Online (Sandbox Code Playgroud)

根据您的输入,输出

aws ec2 create-tags --resources XXXXX --tags Key='A-KEY',Value='A-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='B-KEY',Value='B-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='C-KEY',Value='C-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='D-KEY',Value='D-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='E-KEY',Value='E-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='G-KEY',Value='F-VALUE'
Run Code Online (Sandbox Code Playgroud)

要将这些作为命令执行,请输入sh

aws ec2 describe-tags ... | jq -r ... | sh 
Run Code Online (Sandbox Code Playgroud)

jq真是一次冒险。您需要添加“选择”过滤器以删除以“aws:”开头的键

jq -r '
    .Tags[] | 
    select(.Key | test("^aws:") | not) |
    @sh "aws ... --tags Key=\(.Key),Value=\(.Value)"
'
Run Code Online (Sandbox Code Playgroud)