
У меня есть вопрос относительно скриптов оболочки и инструмента 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/