Como obter carimbo em shell script em arquivo JSON usando a ferramenta jq?

Como obter carimbo em shell script em arquivo JSON usando a ferramenta jq?

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 nowfunçã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 datearray!), considere criar um HH:MM:SScarimbo 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 jopara criar com segurança o vtgarray inicial a partir dos valores de um basharray 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 jolendo o datecomando:

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

Isso depende do shell dividir a saída datenos espaços da string de formato. Você obterá a hora local acima.

A joferramenta está disponível emhttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

informação relacionada