ubuntuusers.de

awk: Zeitstempel auf andere Zeitzone umrechnen

Status: Gelöst | Ubuntu-Version: Lubuntu 14.04 (Trusty Tahr)
Antworten |

maplecut

Avatar von maplecut

Anmeldungsdatum:
7. Februar 2011

Beiträge: 239

Wohnort: Oberschwaben

Ich habe in Monitoring-Daten Zeilen wie diese:

MOD.HU001GV_H00TA24.F_CV;31.05.2014 22:03:30;12,09985

Das sind also drei Spalten, mit Semiḱolon getrennt, Zeitstempel in der Mitte. Der Zeitstempel ist GMT, ich brauche ihn aber in MEZ (Winterzeit), also GMT+1 und würde das gerne mit awk machen. Finden konnte ich bisher nur Formatänderungen des Zeitstempels, aber keine Umrechnung in eine andere Zeitzone. Ich denke, es könnte etwas ähnliches geben, wie bei "date" in der bash, also etwa analog zu z.B.:

`date +%Y%m%d%H%M -d 'now - 1 minutes'

Kann mir jemand behilflich sein?

Grüße, Maplecut

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wie kommst Du darauf, dass Du das ausgerechnet mit awk machen willst ??

Sowas geht zwar, aber es macht bei awk nicht wirklich Spass.
Die awk-Zeitfunktionen (→ "Time Functions") gehen grundsätzlich über "Seconds since Epoch",
und die Umrechnung in diese Sekunden hat ihr eigenes, eigenwilliges Format: YYYY MM DD HH MM SS[ DST].

Konkret: Du müsstest zuerst das Datum mit split zerlegen, dann neu zusammensetzen und mit strftime() und mktime() umwandeln:

track@lucid:~$ echo 'MOD.HU001GV_H00TA24.F_CV;31.05.2014 22:03:30;12,09985'  |  awk -F ";" '{split($2,f,"[. :]"); print strftime("%x %X",mktime(f[3] " " f[2] " " f[1] " " f[4]+1 " " f[5] " " f[6]))}'
31.05.2014 23:03:30 

Viel einfacher wäre, irgendwie die reguläre date()- Funktion zu benutzen.

LG,

track

maplecut

(Themenstarter)
Avatar von maplecut

Anmeldungsdatum:
7. Februar 2011

Beiträge: 239

Wohnort: Oberschwaben

Ich hatte in letzter Zeit gute Erfahrungen mit awk, aber ich bin auch offen für Alternativen. Wie würdest Du es denn machen?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wie gesagt, ich hatte daran gedacht, direkt date zu benutzen. Natürlich muss man dann immer noch die Felder freischneiden, und sogar Jahr und Tag vertauschen, sonst geht es nicht: (daran hatte ich gar nicht gedacht !)

track@lucid:~$ date "+%x %X" -d "2014-05-31 22:03:30 +1"
31.05.2014 23:03:30 

Der Aufwand ist nur wenig geringer, aber es ist etwas übersichtlicher:

track@lucid:~$ echo 'MOD.HU001GV_H00TA24.F_CV;31.05.2014 22:03:30;12,09985'  |  sed -r 's/[^;]*;(..).(..).(....)( .*);.*/\3-\2-\1\4/'  |  xargs -i date "+%x %X" -d {}" +1"
31.05.2014 23:03:30 

Oder Du machst es ganz mit den Mitteln der Shell, mit Arrays, das geht auch:

track@lucid:~$ txt='MOD.HU001GV_H00TA24.F_CV;31.05.2014 22:03:30;12,09985'
track@lucid:~$ oldIFS="$IFS"
track@lucid:~$ IFS="; "
track@lucid:~$ f=( $txt )                              # zerlege den Text in die Felder
track@lucid:~$ IFS="."
track@lucid:~$ d=( ${f[1]} )                           # zerlege Feld 2 in die Datums-Teile
track@lucid:~$ date "+%x %X" -d "${d[2]}-${d[1]}-${d[0]} ${t[2]} +1"
31.05.2014 23:03:30
track@lucid:~$ IFS="$oldIFS"                           # setze den Feldtrenner wieder zurück 

LG,

track

maplecut

(Themenstarter)
Avatar von maplecut

Anmeldungsdatum:
7. Februar 2011

Beiträge: 239

Wohnort: Oberschwaben

Danke track, die erste Variante mit awk funtioniert super!

Wegen des Zerlegens des Zeitstempels hatte ich bedenken, ob das Ganze auch über Tages-, Monats-, und Jahreswechsel funktioniert. Aber wie man sieht, ist alles gut:

echo 'MOD.HU001GV_H00TA24.F_CV;31.12.2013 23:03:30;12,09985'  |  awk -F ";" '{split($2,f,"[. :]"); print $1";" strftime("%x %X",mktime(f[3] " " f[2] " " f[1] " " f[4]+1 " " f[5] " " f[6]))";" $3}'
MOD.HU001GV_H00TA24.F_CV;01.01.2014 00:03:30;12,09985

Also nochmals Danke! Gelöst!

Antworten |