Wie erhalte ich mit dem JQ-Tool einen Stempel in einem Shell-Skript in einer JSON-Datei?

Wie erhalte ich mit dem JQ-Tool einen Stempel in einem Shell-Skript in einer JSON-Datei?

Ich habe eine Frage zum Shell-Skripting und zum JQ-Tool zum Erstellen einer JSON-Datei mit Zeitstempeln.

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

Mit diesem Befehl erhalte ich die folgende JSON-Datei.

{
 "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"
}

Aber ich möchte einen Zeitstempel wie,

"date": [
  15,
  31,
  52
]

Wann

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

Ich sollte den Zeitstempel im gewünschten Format erhalten. Aber ich erhalte die Fehlermeldung:

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

Kann mir jemand helfen, wie ich diesen Zeitstempel in die JSON-Datei bekomme?

Antwort1

Die strptime()Funktion dient dazu,analysiereneine formatierte Zeit (das Gegenteil von dem, was es strftime()tut). Sie wollen strftime().

Verwendung von jq:

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

Dies dient strftime()zum Formatieren der von der nowFunktion angegebenen Zeit. Verwenden Sie es strflocaltime(), um die Zeit in die Ortszeit umzurechnen.

Wenn das zu wortreich ist oder ineffizient erscheint (wir rufen tatsächlich strftime()einmal für jedes Element des dateArrays auf!), dann sollten Sie einen HH:MM:SSZeitstempel erstellenSchnurund teilen Sie es dann an den Doppelpunkten auf:

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

Jeder der oben genannten Befehle kann

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

Vollständiges Skript (wird jozum sicheren Erstellen des Anfangsarrays vtgaus den Werten eines benannten bashArrays verwendet):

#!/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(":")) }'

Sie können den Datumsabschnitt der Daten natürlich auch spontan erstellen, indem joSie den folgenden dateBefehl auslesen:

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

Dies beruht darauf, dass die Shell die Ausgabe anhand dateder Leerzeichen in der Formatzeichenfolge aufteilt. Sie erhalten die Ortszeit aus dem obigen Wert.

Das joTool ist erhältlich beihttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

verwandte Informationen