Как получить штамп в скрипте оболочки в файле JSON с помощью инструмента jq?

Как получить штамп в скрипте оболочки в файле JSON с помощью инструмента jq?

У меня есть вопрос относительно скриптов оболочки и инструмента jq для создания json-файла с временными метками.

echo "{\"vtg\":[$value]}" | jq -a '. + {date: now|strflocaltime("%r")}' > sample.json 

С помощью этой команды я получаю следующий json-файл.

{
 "vtg": [
 11.769,
 11.769,
 11.339,
 11.788,
 11.867,
 11.886,
 11.808,
 11.339,
 11.554,
 11.182
 ],
 "date": "03:31:52 PM"
}

Но мне нужна временная метка, например,

"date": [
  15,
  31,
  52
]

Когда делать

 strptime("%H:%M:%SZ")

Я должен получить эту временную метку в нужном мне формате. Но она выдает ошибку:

jq: error (at <stdin>:10): strptime/1 requires string inputs and arguments

Может ли кто-нибудь помочь мне получить эту метку времени в файле JSON?

решение1

Функция strptime()используется дляразобратьотформатированное время (обратное тому, что strftime()делает). Вам нужно strftime().

С использованием jq:

jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

Используется strftime()для форматирования времени, заданного функцией now. Используется strflocaltime()для преобразования времени в местное время.

Если это слишком многословно или кажется неэффективным (мы на самом деле вызываем strftime()один раз для каждого элемента массива date!), то рассмотрите возможность создания HH:MM:SSвременной метки.нить, а затем разбить его по двоеточиям:

jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'

Любая из вышеперечисленных команд может привести к

{
  "date": [
    "07",
    "01",
    "23"
  ]
}

Полный скрипт (используется joдля безопасного создания начального vtgмассива из значений именованного bashмассива):

#!/bin/bash

value=(11.769 11.769 11.339 11.788 11.867 11.886 11.808 11.339 11.554 11.182)

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'

# or...

jo vtg="$( jo -a "${value[@]}" )" |
jq '. += { date: (now | strftime("%H:%M:%S") | split(":")) }'

Очевидно, вы также можете создать раздел данных с датой «на лету», считывая joданные из dateкоманды:

jo vtg="$(  jo -a "${value[@]}" )" \
   date="$( jo -a $( date +'%H %M %S' ) )"

Это основано на разделении оболочкой вывода по dateпробелам в строке формата. Вы получите местное время из вышеприведенного.

Инструмент joдоступен по адресуhttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

Связанный контент