描述实例的排序输出?

时间:2018-06-08 00:46:27

标签: aws-cli jmespath

我看到了关于这个主题的上一个问题,但答案只是“将它管道化为脚本语言!”#34;我觉得不满意。我知道JMESPath有sort_bysort,但我无法弄清楚如何使用它们。

我有

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

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

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

思想?

4 个答案:

答案 0 :(得分:8)

简短回答

添加

[]

在你的表达结束时。括号(sort_by(...))将展平结构,--query 'Reservations[*].Instances[*].[LaunchTime,InstanceId,PrivateIpAddress,Tags[?Key==`Name`] | [0].Value][] | sort_by(@, &[3])' 将按第四列对结果(这是一个四列表)进行排序。完整查询将是:

describe-instances

长答案

检查您当前的查询结果

根据describe-instances docs{ "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"
  ]
]

查询结果:

{{1}}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这是另一个可行的例子:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value,Instance:InstanceId} | sort_by(@, &[0].Name)'

答案 3 :(得分:-2)

答案是添加| 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