使用带条件的jq过滤JSON

ntjbwcob  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(230)

我有以下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命令是否可以做到这一点?如果可以,如何做到?

iezvtpos

iezvtpos1#

如果您只对最后两个元素感兴趣(而忽略了问题中的输入是无效JSON这一事实):

.LaunchTemplates
| sort_by(.CreateTime)
| map(.LaunchTemplateName|select(startswith("")))[:-3]
| reverse[]
  • sort_by(.CreateTime)按CreateTime属性进行 * 升序 * 排序。
  • map(.LaunchTemplateName|select(startswith("bla"))将输入数组Map到仅包含带有“bla”前缀的模板名称的数组。
  • [:-3]对输入数组进行切片以丢弃最后3个元素(即,丢弃3个最新元素)。
  • reverse[]反转数组并使其元素流动。

输出:

"bla-222"
"bla-233"

相关问题