在运行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
答案 0 :(得分:0)
使用awk
和date
命令解决问题的方法:
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"