我看到了关于这个主题的上一个问题,但答案只是"将其用于脚本语言!",我觉得这不令人满意.我知道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)
作为对 @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)
答案是添加| 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)
| 归档时间: |
|
| 查看次数: |
5044 次 |
| 最近记录: |