Пытаясь найти дату на основе JQ - PullRequest
0 голосов
/ 03 февраля 2020

В CLI Home Assistant, работающем 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

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

С вашим вводом, используя 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"

Альтернативы

  • yaml2 json с jq

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

  • Go версия yq

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

    создает список полей "date".

0 голосов
/ 04 февраля 2020

Вот решение only-jq, которое, конечно, поставляется с оговорками типа любого предлагаемого решения, которое рассматривает YAML как текст:

< hassio.txt jq -nR '
  [inputs | select(test("^- date")) | sub(".*date: ";"") | fromjson]
  | sort | reverse[-2] | sub("\\..*";"")'
"2020-01-24T03:00:01"
0 голосов
/ 03 февраля 2020

Решение вашей проблемы с использованием команд 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.

...