我看到了关于这个主题的上一个问题,但答案只是“将它管道化为脚本语言!”#34;我觉得不满意。我知道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
它以随机顺序输出正确的数据。我想按数据的最后一列排序,Tag Name,又名Tags[?Key==`Name`]
,它以原始形式显示如下:
{
"Tags": [{
"Value": "application-server-ab3634b34364a-2",
"Key": "Name"
}, {
"Value": "production",
"Key": "Group"
}]
}
思想?
答案 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