我有以下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命令?如果有,怎么做?
如果您只对最后两个元素感兴趣(并且忽略了问题中的输入是无效JSON的事实):
.LaunchTemplates
| sort_by(.CreateTime)
| map(.LaunchTemplateName|select(startswith("")))[:-3]
| reverse[]
sort_by(.CreateTime)
根据CreateTime属性对升序排序map(.LaunchTemplateName|select(startswith("bla"))
将输入数组映射到只包含带有"bla"的模板名称的数组;前缀。[:-3]
切片输入数组,删除最后3个元素(即删除3个最新的元素)。reverse[]
反转数组并流式传输其元素。 输出:
"bla-222"
"bla-233"