397 Stimmen

Wie konvertiert man in der Bash Zeitstempel in Daten?

Ich brauche einen Shell-Befehl oder ein Skript, das einen Unix-Zeitstempel in ein Datum umwandelt. Die Eingabe kann entweder über den ersten Parameter oder über stdin erfolgen, so dass die folgenden Verwendungsmuster möglich sind:

ts2date 1267619929

y

echo 1267619929 | ts2date

Beide Befehle sollten "Wed Mar 3 13:38:49 2010" ausgeben.

15voto

Blago Punkte 4619

Ich verwende diesen plattformübergreifenden Einzeiler:

date -d @1267619929 2>/dev/null || date -r 1267619929

Es sollte sowohl unter macOS als auch unter modernen Versionen der gängigen Linux-Distributionen funktionieren.

11voto

gniourf_gniourf Punkte 41590

Seit Bash 4.2 können Sie mit printf 's %(datefmt)T Format:

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

Das ist schön, denn es ist ein Shell-Builtin. Das Format für datefmt ist eine Zeichenkette, die von strftime(3) (siehe man 3 strftime ). Hier %c ist:

%c Die bevorzugte Darstellung von Datum und Uhrzeit Gebietsschema.


Wenn Sie nun ein Skript wollen, das ein Argument akzeptiert und, wenn keins angegeben wird, stdin liest, können Sie wie folgt vorgehen:

#!/bin/bash

if (($#)); then
    printf '%(%c)T\n' "$@"
else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi

10voto

codaddict Punkte 426877

Sie können dieses einfache awk-Skript verwenden:

#!/bin/gawk -f   
{ print strftime("%c", $0); }

Beispielhafte Verwendung:

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$

6voto

user3544224 Punkte 61

Ich verwende dies bei der Konvertierung von Protokolldateien oder deren Überwachung:

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

6voto

Daniel Farrell Punkte 11558

Unter OSX oder BSD gibt es eine entsprechende -r Flagge, die offenbar einen Unix-Zeitstempel annimmt. Hier ist ein Beispiel, das date viermal ausführt: einmal für das erste Datum, um zu zeigen, was es ist; einmal für die Umwandlung in einen Unix-Zeitstempel mit %s und schließlich eine, die mit -r konvertiert, was %s liefert zurück zu einer Zeichenkette.

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017

Zumindest scheint es auf meinem Rechner zu funktionieren.

$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X