我有以下JSON:
{
"LaunchTemplates": [
{
"LaunchTemplateName": "bla-99",
"CreateTime": "2022-12-13T13:40:33+00:00"
},
{
"LaunchTemplateName": "abcabc",
"CreateTime": "2022-12-13T09:58:14+00:00"
},
{
"LaunchTemplateName": "bla-34",
"CreateTime": "2022-12-13T13:58:56+00:00"
},
{
"LaunchTemplateName": "bla-222",
"CreateTime": "2022-12-11T13:58:56+00:00"
},
{
"LaunchTemplateName": "bla-233",
"CreateTime": "2022-12-10T13:58:56+00:00"
}
]
}
我想过滤JSON并在过滤后打印最旧的模板。我有下面的jq
查询,它在过滤后打印模板名称:
file.json | jq '.LaunchTemplates[].LaunchTemplateName|select(startswith("bla"))'
输出量:
bla-99
bla-34
bla-222
bla-233
现在我想给查询添加更多的逻辑,并执行如下操作:如果bla行数大于3,则打印最早的bla行(根据日期字段)。在我的例子中,输出应该是:
bla-233
jq
或其他shell命令是否可以做到这一点?如果可以,如何做到?
1条答案
按热度按时间iezvtpos1#
如果您只对最后两个元素感兴趣(而忽略了问题中的输入是无效JSON这一事实):
sort_by(.CreateTime)
按CreateTime属性进行 * 升序 * 排序。map(.LaunchTemplateName|select(startswith("bla"))
将输入数组Map到仅包含带有“bla”前缀的模板名称的数组。[:-3]
对输入数组进行切片以丢弃最后3个元素(即,丢弃3个最新元素)。reverse[]
反转数组并使其元素流动。输出: