
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 now
Funktion 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 date
Arrays auf!), dann sollten Sie einen HH:MM:SS
Zeitstempel 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 jo
zum sicheren Erstellen des Anfangsarrays vtg
aus den Werten eines benannten bash
Arrays 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 jo
Sie den folgenden date
Befehl auslesen:
jo vtg="$( jo -a "${value[@]}" )" \
date="$( jo -a $( date +'%H %M %S' ) )"
Dies beruht darauf, dass die Shell die Ausgabe anhand date
der Leerzeichen in der Formatzeichenfolge aufteilt. Sie erhalten die Ortszeit aus dem obigen Wert.
Das jo
Tool ist erhältlich beihttps://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/