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.

4voto

chiborg Punkte 25033

Ich habe selbst ein Skript geschrieben, das dies tut:

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fi
else
    p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'

4voto

webb Punkte 3738

In dieser Antwort kopiere ich die Antwort von Dennis Williamson und ändere sie leicht ab, um eine enorme Geschwindigkeitssteigerung zu ermöglichen, wenn eine Spalte mit vielen Zeitstempeln an das Skript übergeben wird. Beispielsweise dauerte die Eingabe von 1000 Zeitstempeln in das ursprüngliche Skript mit xargs -n1 auf meinem Rechner 6,929s im Gegensatz zu 0,027s mit dieser modifizierten Version:

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    date -d @$1 +%c
fi

3voto

kai Punkte 1213

Ein Beispiel:

$ date
Tue Mar 22 16:47:06 CST 2016

$ date -d "Tue Mar 22 16:47:06 CST 2016" "+%s"
1458636426

$ date +%s
1458636453

$ date -d @1458636426
Tue Mar 22 16:47:06 CST 2016

$ date --date='@1458636426'
Tue Mar 22 16:47:06 CST 2016

0voto

William Casarin Punkte 2472

Wenn Sie viele Zeitstempel auf einmal formatieren wollen, habe ich ein C-Programm namens datefmt die Zeitstempel in einem Textstrom formatiert:

Nehmen wir an, wir haben einige Protokolle, die Unix-Zeitstempel enthalten:

$ cat logs.txt

EVENTS  1638499687   blahblah log1
EVENTS  1638499717   blahblah log2

Wir können dieses Protokoll in datefmt einspeisen, um die Zeitstempel in lesbare Daten umzuwandeln:

$ <logs.txt datefmt

EVENTS  2021-12-02 18:48   blahblah log1
EVENTS  2021-12-02 18:48   blahblah log2

Natürlich können Sie das Format auch individuell anpassen:

$ <logs.txt datefmt "DATE:'%m-%d %R'"

EVENTS  DATE:'12-02 18:48'   blahblah log1
EVENTS  DATE:'12-02 18:48'   blahblah log2

Ich habe dies in NixOS gepackt, hoffentlich wird es bald zu anderen Distributionen durchsickern, aber im Moment müssen Sie den Tarball herunterladen und ihn mit make

0voto

stefan123t Punkte 133

Ich musste die Zeitstempel in meiner Bash-History inline konvertieren, damit sie für mich Sinn machen.

Vielleicht stammt das Folgende aus einer Antwort auf Wie kann ich eine Teilzeichenkette durch die Ausgabe eines Shell-Befehls mit sed, awk oder ähnlichem ersetzen? könnte auch für andere Leser interessant sein. Das Lob für den ursprünglichen sed-Inline-Code geht an @Gabriel.

cat ~/.bash_history | sed "s/^#\([0-9]\+\)$/echo -n '#'; date -u --d @\1 '\+\%Y-\%m-\%d \%T'/e" | less

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