
Tenho dúvidas sobre scripts de shell e ferramenta jq para criar um arquivo json com carimbos de data/hora.
echo "{\"vtg\":[$value]}" | jq -a '. + {date: now|strflocaltime("%r")}' > sample.json
Com este comando estou obtendo o arquivo json abaixo.
{
"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"
}
Mas eu quero um carimbo de data/hora como,
"date": [
15,
31,
52
]
Quando fazer
strptime("%H:%M:%SZ")
Devo obter esse carimbo de data e hora no formato que desejo. Mas isso me dá erro:
jq: error (at <stdin>:10): strptime/1 requires string inputs and arguments
Alguém pode me ajudar como obter esse carimbo de data/hora no arquivo JSON?
Responder1
A strptime()
função é usada paraanalisaruma hora formatada (o inverso do que strftime()
faz). Você quer strftime()
.
Usando jq
:
jq -n 'now as $t | { date: [ ($t|strftime("%H")), ($t|strftime("%M")), ($t|strftime("%S")) ] }'
Isso é usado strftime()
para formatar o tempo fornecido pela now
função. Use strflocaltime()
para converter a hora para a hora local.
Se isso for muito prolixo ou parecer ineficiente (na verdade, estamos chamando strftime()
uma vez para cada elemento do date
array!), considere criar um HH:MM:SS
carimbo de data/horacordae, em seguida, dividindo-o entre dois pontos:
jq -n '{ date: (now | strftime("%H:%M:%S") | split(":")) }'
Qualquer um dos comandos acima pode produzir
{
"date": [
"07",
"01",
"23"
]
}
Script completo (utilizado jo
para criar com segurança o vtg
array inicial a partir dos valores de um bash
array nomeado):
#!/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(":")) }'
Obviamente, você também pode criar a seção de data dos dados dinamicamente jo
lendo o date
comando:
jo vtg="$( jo -a "${value[@]}" )" \
date="$( jo -a $( date +'%H %M %S' ) )"
Isso depende do shell dividir a saída date
nos espaços da string de formato. Você obterá a hora local acima.
A jo
ferramenta está disponível emhttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/