0

在 Home Assistant CLI 中,运行hassio snapshots list中,输出如下,我试图找到最后一个日期以保留在此输出中回顾 3 天(在下面的示例列表中,这应该是 2020-01-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
4

3 回答 3

0

使用awkdate命令解决您的问题:

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

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

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

于 2020-02-03T19:21:49.637 回答
0

这是一个 only-jq 解决方案,它当然带有各种警告,就像任何将 YAML 视为文本的提议解决方案一样:

< hassio.txt jq -nR '
  [inputs | select(test("^- date")) | sub(".*date: ";"") | fromjson]
  | sort | reverse[-2] | sub("\\..*";"")'
"2020-01-24T03:00:01"
于 2020-02-03T22:20:26.353 回答
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]'

  • yq 的 Go 版本

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

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

于 2020-02-03T19:28:18.313 回答