【问题标题】:Trying to find date based on jq试图根据 jq 查找日期
【发布时间】:2020-05-19 13:35:51
【问题描述】:

在 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

【问题讨论】:

  • jq 无法读取 yaml 文件。请改用yq
  • yq 不是 HA 默认安装的一部分,我不能依赖 3.rd 方安装。

标签: json yaml jq home-assistant


【解决方案1】:

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

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

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

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

【讨论】:

  • 您能否提供一个示例来解决我上面的 CLI 行?
【解决方案2】:

根据您的输入,使用基于 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'

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

【讨论】:

  • 感谢您的建议,很遗憾,yq 不是默认 HA 安装的一部分,因此我不能使用它,因为我不能依赖 3.rd 方安装。跨度>
【解决方案3】:

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

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

【讨论】:

  • 感谢您的努力,但我仍然是新手,无法完全理解如何将您的建议替换为之前的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 )
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多