Rettet das Datum!

18. März 2013 at 22:44

Das kleine Kommando ‚date‘ der Linux-Shell wird oft mächtig unterschätzt. Man kann das Ausgabeformat setzen und sogar das Datum relativ zum heutigen Tag bestimmen. Hierfür gibt es viele Anwendungsfälle:

# Datum ausgeben
date
Mon Mar 18 20:00:00 CET 2013
# Das Datum von gestern
date -d "yesterday"
Sun Mar 17 20:00:00 CET 2013
# Das Datum von vor 2 Tagen
date -d "2 days ago"
Sat Mar 16 20:00:00 CET 2013
# Das Datum im ISO-Format
date +"%Y-%m-%d"
2013-03-18

Hier nun eine Kombination daraus:

# Das Datum von gestern im ISO-Format
date +"%Y-%m-%d" -d "yesterday"
2013-03-17

Nun erzeugen wir einen Dateinamen:

date +"something-%Y-%m-%d.log" -d "yesterday"
something-2013-03-17.log

Wenn wir den Namen in einer Variable benötigen:

FILENAME=$(date +"something-%Y-%m-%d.log" -d "yesterday")
echo "$FILENAME"

Ein anderer Anwenungsfall: Bestimmen wir die Zeit zwischen 2 Zeitpunkten:

START=$(date "+%s")
(do something)
ENDE=$(date "+%s")
let "DIFF = $ENDE - $START"
echo "$DIFF Sekunden"

Nun erhalten wir die Zeit-Differenz in Sekunden. Aber was sagt uns schon 2800 Sekunden? Auch hier kann date helfen, die Zeit umzurechnen:

date -d "00:00:00 $DIFF seconds" "+%H:%M:%S"
00:46:40

Das obige Script lief also 46 Minuten und 40 Sekunden. So läßt sich dem nächtlichen Backup-Script schnell beibringen, wie es seine Laufzeit auszugeben hat.

Noch ein Trick: Mit folgendem Befehl kann man die 3 Variablen $DAY, $MONTH und $YEAR in einer Zeile setzen:

eval $(date "+DAY=%d; MONT=%m; YEAR=%Y")

Nun läßt sich mit ‚echo $YEAR‘, ‚echo $MONT‘ oder ‚echo $DAY‘ das Datum im Script abfragen.

Ach ja, wie alt bin ich eigentlich?

BIRTHDAY="1975-01-10"

BDAY_SEC=$(date "+%s" -d "$BIRTHDAY")
NOW_SEC=$(date "+%s")

let "DIFF_SEC = $NOW_SEC - $BDAY_SEC"
echo "Alter: $DIFF_SEC Sekunden"

let "DIFF_DAYS = $DIFF_SEC / 60 / 60 / 24"
echo "Alter: $DIFF_DAYS Tage"

Es gibt so viele Anwendungsfälle. Also, rettet das Datum! :-)

Mehr zum Thema date: hier