使用带有条件的jq过滤JSON



我有以下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"