18

我看到了关于这个主题的上一个问题,但答案只是“将它传送到脚本语言!”,我觉得不满意。我知道 JMESPath 有sort_by, 和sort,但我不知道如何使用它们。

我有

aws ec2 describe-instances \
   --filters "Name=tag:Group,Values=production" "Name=instance-state-name,Values=running" "Name=tag:Name,Values=prod-*-${CURRENT_SHA}-*" \
   --query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]' \
   --output table

它以随机顺序输出正确的数据。我想按数据的最后一列进行排序,标签名称,aka Tags[?Key==`Name`],原始形式如下所示:

{
  "Tags": [{
    "Value": "application-server-ab3634b34364a-2",
    "Key": "Name"
  }, {
    "Value": "production",
    "Key": "Group"
  }]
}

想法?

4

4 回答 4

23

简短的回答

添加

[] | sort_by(@, &[3])

在你的表达结束。方括号 ( []) 将展平结构,sort_by(...)将结果(这是一个四列表)按第四列排序。完整的查询将是:

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][] | sort_by(@, &[3])'

长答案

检查您当前的查询结果

根据describe-instances文档describe-instances输出的结构如下所示:

{
  "Reservations": [
    {
      "Instances": [
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R1I1",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "foo"}]
        },
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R1I2",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "baz"}]
        }
      ]
    },
    {
      "Instances": [
        {
          "LaunchTime": "..LaunchTime..",
          "InstanceId": "R2I1",
          "PrivateIpAddress": "..PrivateIpAddress..",
          "Tags": [{"Key": "Name", "Value": "bar"}]
        }
      ]
    }
  ]
}

使用您的原始查询

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]'

将输出

[
  [
    [
      "..LaunchTime..",
      "R1I1",
      "..PrivateIpAddress..",
      "foo"
    ],
    [
      "..LaunchTime..",
      "R1I2",
      "..PrivateIpAddress..",
      "baz"
    ]
  ],
  [
    [
      "..LaunchTime..",
      "R2I1",
      "..PrivateIpAddress..",
      "bar"
    ]
  ]
]

展平查询结果

您可以在上述查询结果中看到您正在获取一个表列表 ( [[{},{}],[{}]])。我想您需要一个非嵌套表 ( [{},{},{}])。为此,只需[]在查询末尾添加,即

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][]'

这将使结构变平,导致

[
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ]
]

现在是时候对表格进行排序了。

对表格进行排序

使用sort_by时不要忘记在表达式前面加上&(&)。这样,您可以指定对该表达式的引用sort_by,然后将其传递给.

示例: data | sort_by(@, &@)相当于data | sort(@).

TagName您创建的表中的 ( )[LaunchTime,InstanceId,PrivateIpAddress,TagName]是第四列。您可以通过将表传递给表达式来获取该列[3]

TableExpression | [3]

但是,您希望按第四列对表格进行排序。你可以这样做:

TableExpression | sort_by(@, &[3])

结果查询将是:

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`][] | [0].Value] | sort_by(@, &[3])'

查询结果:

[
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ]
]
于 2018-06-13T23:03:16.703 回答
4

作为对@ColinK 答案的增强,我想对一个具有自定义列标题但在语法上遇到困难的表进行排序。我最终让它工作了,所以我想我会分享以防其他人也想做同样的事情。我为 State 添加了一列并按该列排序。

--query 'sort_by(Reservations[*].Instances[*].{LaunchTime:LaunchTime, ID:InstanceId,IP:PrivateIpAddress,State:State.Name,Name:Tags[?Key==`Name`] | [0].Value}[], &State)' 
于 2019-04-29T18:21:52.183 回答
2

这是另一个也适用的示例:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value,Instance:InstanceId} | sort_by(@, &[0].Name)'
于 2019-12-12T10:24:40.623 回答
1

答案是添加| sort_by(@, &@[0][3])

aws ec2 describe-instances \
  --filters "Name=tag:Group,Values=production" "Name=instance-state-name,Values=running" "Name=tag:Name,Values=prod-*-${CURRENT_SHA}-*" \
  --query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]| sort_by(@, &@[0][3])' \
  --output table
于 2018-06-19T03:14:11.560 回答