尝试根据jq查找日期

时间:2020-02-03 18:42:55

标签: json yaml jq home-assistant

在运行hassio snapshots list的Home Assistant CLI中,输出如下所示,在这里我试图找到要保留在该输出中的最后日期以回溯3天(在下面的示例列表中,这应该是2020年1月24日):

- date: "2019-12-10T03:00:01.313293+00:00"
  name: Automated backup 2019-12-10 04:00
  protected: false
  slug: a0d3f958
  type: full
- date: "2020-02-03T16:25:55.265219+00:00"
  name: Automated backup 2020-02-03 17:25
  protected: false
  slug: acb7907b
  type: full
- date: "2020-02-03T15:00:11.584836+00:00"
  name: Automated backup 2020-02-03 16:00
  protected: false
  slug: 6284d707
  type: full
- date: "2020-01-24T03:00:01.169351+00:00"
  name: Automated backup 2020-01-24 04:00
  protected: false
  slug: 53d10566
  type: full

此方法较早起作用,但是有所变化,我现在无法解决问题所在:

last_date_to_keep=$(hassio snapshots list | jq .data.snapshots[].date | sort -r | head -n "3" | tail -n 1 | xargs date -D "%Y-%m-%dT%T" +%s --date )

输出为:

zsh: no matches found: .data.snapshots[].date
date: option requires an argument: date

3 个答案:

答案 0 :(得分:0)

使用awkdate命令解决问题的方法:

awk -v ref=$(date "+%s" -d "3 days ago") '
    /^- date: /{t=mktime(gensub(/[-"T:]|\.[0-9+:"]*/," ","G",$3));} t>ref' file

这依赖于awk mktime函数,该函数将字符串日期转换为unix时间戳。
gensub函数将日期格式化为mktime所需的格式。

变量ref设置为date命令给定的日期参考。

答案 1 :(得分:0)

根据您的输入,使用基于Python的yq(https://kislyuk.github.io/yq):

yq '.[].date' 

产生:

"2019-12-10T03:00:01.313293+00:00"
"2020-02-03T16:25:55.265219+00:00"
"2020-02-03T15:00:11.584836+00:00"
"2020-01-24T03:00:01.169351+00:00"

例如,您还可以在yq的同一轮中运行(反向)排序和选择。

yq 'map(.date) | sort | reverse[-2] | .[0:10]' hassio.txt 
"2020-01-24"

替代品

  • yaml2json和jq

    yaml2json hassio.txt | jq 'map(.date) | sort | reverse[-2] | .[0:10]'

  • Go版本的yq

    yq r hassio.txt '[*].date'

    生成“日期”字段的列表。

答案 2 :(得分:0)

这是唯一的jq解决方案,当然,与任何将YAML视为文本的建议解决方案一样,附带了以下警告:

< hassio.txt jq -nR '
  [inputs | select(test("^- date")) | sub(".*date: ";"") | fromjson]
  | sort | reverse[-2] | sub("\\..*";"")'
"2020-01-24T03:00:01"