描述实例的排序输出?

Col*_*inK 6 aws-cli jmespath

我看到了关于这个主题的上一个问题,但答案只是"将其用于脚本语言!",我觉得这不令人满意.我知道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
Run Code Online (Sandbox Code Playgroud)

它只是以随机顺序输出正确的数据.我想按数据的最后一列排序,Tag Name,aka Tags[?Key==`Name`],原始形式如下所示:

{
  "Tags": [{
    "Value": "application-server-ab3634b34364a-2",
    "Key": "Name"
  }, {
    "Value": "production",
    "Key": "Group"
  }]
}
Run Code Online (Sandbox Code Playgroud)

思考?

myr*_*rdd 11

简短的回答

[] | sort_by(@, &[3])
Run Code Online (Sandbox Code Playgroud)

在你的表达结束时.方括号([])将使结构变平,sort_by(...)将按第四列对结果(四列表格)进行排序.完整查询将是:

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

答案很长

检查您当前的查询结果

根据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"}]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用原始查询

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value]'
Run Code Online (Sandbox Code Playgroud)

将输出

[
  [
    [
      "..LaunchTime..",
      "R1I1",
      "..PrivateIpAddress..",
      "foo"
    ],
    [
      "..LaunchTime..",
      "R1I2",
      "..PrivateIpAddress..",
      "baz"
    ]
  ],
  [
    [
      "..LaunchTime..",
      "R2I1",
      "..PrivateIpAddress..",
      "bar"
    ]
  ]
]
Run Code Online (Sandbox Code Playgroud)

展平查询结果

您可以在上面的查询结果中看到您正在获取表的列表([[{},{}],[{}]]).我想你想要一个非嵌套的表([{},{},{}]).要实现这一点,只需[]在查询结束时添加,即

--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][]'
Run Code Online (Sandbox Code Playgroud)

这将使结构变平,导致

[
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ]
]
Run Code Online (Sandbox Code Playgroud)

现在是时候排序表了.

排序表

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

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

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

TableExpression | [3]
Run Code Online (Sandbox Code Playgroud)

但相反,您希望按第四列对表进行排序.你可以这样做:

TableExpression | sort_by(@, &[3])
Run Code Online (Sandbox Code Playgroud)

结果查询将是:

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

查询结果:

[
  [
    "..LaunchTime..",
    "R2I1",
    "..PrivateIpAddress..",
    "bar"
  ],
  [
    "..LaunchTime..",
    "R1I2",
    "..PrivateIpAddress..",
    "baz"
  ],
  [
    "..LaunchTime..",
    "R1I1",
    "..PrivateIpAddress..",
    "foo"
  ]
]
Run Code Online (Sandbox Code Playgroud)


Tre*_*erW 6

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

--query 'sort_by(Reservations[*].Instances[*].{LaunchTime:LaunchTime, ID:InstanceId,IP:PrivateIpAddress,State:State.Name,Name:Tags[?Key==`Name`] | [0].Value}[], &State)' 
Run Code Online (Sandbox Code Playgroud)


Col*_*inK 3

答案是添加| 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
Run Code Online (Sandbox Code Playgroud)