Zu Befehl: date & cal

Aus LinuxUser 06/2003

Zu Befehl: date & cal

Zeitgemäße Werkzeuge

Die Kommandozeilen-Tools cal und date erzeugen Kalender und bearbeiten Datum und Uhrzeit. Wenn man sie geschickt einsetzt, kann man daraus zum Beispiel eine kleine Geburtstagsverwaltung machen.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Es muss nicht immer ein grafisches Tool oder eine Schnittstelle zum PDA sein, um den Überblick über die eigenen Termine zu behalten. Linux bringt mit cal und date eigene Kalender-Software für die Kommandozeile. Ungeschlagen sind diese Tools, wenn es um den Einsatz in Shell-Skripten geht. Nach einem Blick auf die verschiedenen Optionen von cal und date zeigen wir daher anhand eines einfachen Beispiels, wie Sie mit wenigen Handgriffen ein Skript zaubern, das Sie beim Einloggen an die Geburtstage Ihrer Lieben erinnert.

Welches Jahr?

Hier kommt ein Programm, mit dem Sie einen einfachen Kalender auf die Kommandozeile zaubern:

huhn@asteroid:~$ cal
     April 2003
 S  M Tu  W Th  F  S
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Ohne Parameter gestartet, wird nur der aktuelle Monat angezeigt. Die Option -y hingegen sorgt dafür, dass ein Kalender für das aktuelle Jahr ausgegeben wird. Wenn Sie den Output durch less pipen (cal -yless), scrollt der Kalender nicht aus dem Fenster heraus. Einen bestimmten Monat zeigt cal an, wenn Sie an den Aufruf den Monat und das Jahr (vierstellig) anhängen, also z. B. cal 06 2003 für den Juni 2003. Es reicht nicht, die Jahreszahl zweistellig anzugeben; der Aufruf cal 06 99 würde nicht den Juni 1999 anzeigen, sondern den Juni des Jahres 99 n. Chr. – cal geht zurück bis zum 1. Januar 0001.

Die Option -j sorgt dafür, dass cal die Tage ab Jahresbeginn angibt (Julianische Darstellung):

huhn@asteroid:~$ cal -j
        April 2003
  S   M  Tu   W  Th   F   S
         91  92  93  94  95
[…]

Julianischer / Gregorianischer Kalender

Der Julianische Kalender war eine grundlegende Reform des römischen Kalenders und wurde 46 v. Chr. von Julius Cäsar eingeführt. Dem Jahr wurde alle vier Jahre ein Schalttag hinzugefügt; der Jahresbeginn wurde auf den ersten Januar verlegt. Da dieser Kalender aber nicht exakt der astronomischen Zeit entsprach, veranlasste Papst Gregor XIII. im Jahr 1582 eine Kalenderreform (einmaliger Wegfall von zehn Kalendertagen zum Ausgleich, neue Schaltjahrregelung, nach der die Schalttage in den Jahren fortfallen, die durch 100, aber nicht durch 400 teilbar sind). Der Gregorianische Kalender wurde zunächst nur in katholischen Gegenden angenommen; nach und nach setzte sich die neue Zeitzählung aber durch.

Die richtige Zeit

Mit dem Befehl date erfahren Sie das aktuelle Datum und die Uhrzeit (für die eingestellte Zeitzone) und dürfen darüber hinaus als Superuser root die Systemzeit neu setzen. Ohne Parameter gibt date die aktuelle Systemzeit aus:

huhn@asteroid:~$ date
Wed Apr 23 12:55:37 CEST 2003

Wer die englischen Ausdrücke für Woche und Monat nicht mag, setzt die Umgebungsvariable LC_TIME auf einen gültigen Locales-Wert. Mit dem Kommando export LC_TIME=de_DE bringen Sie date z. B. dazu, Deutsch zu sprechen:

huhn@asteroid:~$ export LC_TIME=de_DE
huhn@asteroid:~$ date
Mit Apr 23 13:55:32 CEST 2003

Mit Hilfe von Umgebungsvariablen lässt sich date auch noch zu anderen Ausgaben überreden. Im Verzeichnis /usr/share/zoneinfo finden Sie eine Übersicht aller Zeitzonen, einige davon in Unterverzeichnissen. Durch temporäres Verändern der Variable TZ (für “TimeZone”) finden Sie beispielsweise heraus, wie spät es auf der Osterinsel ist:

huhn@asteroid:~$ TZ=Chile/EasterIsland date
Mit Apr 23 11:34:26 EAST 2003

Sie können sich das Datum in verschiedenen Ausgabeformaten anzeigen lassen. Dazu verwenden Sie das Pluszeichen “+”, gefolgt von einem Prozentzeichen “%” und Buchstabensequenzen. Die wichtigsten Ausgabeformate finden Sie in Tabelle 1.

Tabelle 1: Ausgabeformate für date

%% das Prozentzeichen selbst
%n Zeilenende
%t Tabulator
%a Wochentag (Kurzform), Output: Mon
%A Wochentag (Langform), Output: Montag
%b Monatsname (Kurzform), Output: Apr
%B Monatsname (Langform), Output: April
%d Tag (zweistellig), Output: 01
%e Tag (einstellig, mit Leerzeichen), Output: 1
%D das Datum in der Form mm/dd/yy, Output: 04/29/03
%H Stunden (0 bis 23)
%I Stunden (1 bis 12)
%M Minuten (00 bis 59)
%p Vor- oder Nachmittag (AM, PM)
%r Zeitangabe, zwölf Stunden (hh:mm:ss AM/PM)
%T Zeitangabe, 24 Stunden (hh:mm:ss)
%Z Zeitzone

Durch Angabe von -d DATUM (oder –date=DATUM) wird das angegebene DATUM verwendet. Mögliche Angaben sind z. B. yesterday, next, 3 days ago oder das volle Datum (09 June 1973):

huhn@asteroid:~$ date -d "09 June 1973"
Sam Jun 9 00:00:00 CET 1973

Up to date!

Der Superuser root darf mit date die Systemzeit stellen. Das Kommando erwartet dabei die Angabe der Zeit in der Form MMDDhhmmCCYY.ss ohne vorangestelltes Pluszeichen +, z. B.:

asteroid:~# date 04111723
Fre Apr 11 17:23:00 CEST 2003

Gesetzt werden dürfen:

  • MM: Monat, z. B. 04
  • DD: Tag, z. B. 13
  • hh: Stunde, z. B. 12
  • mm: Minute, z. B. 59
  • CC: die ersten beiden Stellen der Jahreszahl (optional), z. B. 19
  • YY: die letzten beiden Stellen der Jahreszahl (optional), z. B. 73
  • ss: die Sekunden (optional), z. B. 24

Mit der Zusatzoption -s darf beim Setzen der Zeit auch eine etwas freiere Notation verwendet werden, z. B. date -s 04/29/2003:

asteroid:~# date -s 04/29/2003
Die Apr 29 00:00:00 CEST 2003
asteroid:~# date -s "04/29/2003 15:58"
Die Apr 29 15:58:00 CEST 2003

Beachten Sie, dass eine Änderung der Systemzeit nicht die CMOS-Uhr beeinflusst. Um diese an die aktuelle Systemzeit anzupassen, verwenden Sie (ebenfalls als Superuser root) den Befehl hwclock -w (oder in der Langform hwclock –systohc, diese Option steht für “system to hardware clock”).

Happy Birthday to you!

Seine große Stärke zeigt das Kommando date in Shell-Skripten. Im Geburtstagskalender (siehe Listing 1) zeigen wir, wie Sie cal und date schön kombinieren können. Ausgangspunkt ist eine versteckte Datei im eigenen Home-Verzeichnis (~/.birthdays). Pro Zeile gibt es dort ein Datum und einen Namen:

huhn@asteroid:~$ cat .birthdays
28.02.  Petronella
28.04.  Jones
27.04.  Easter
…

Im Skript birthday.sh wird zunächst die Variable heute_cal mit der Ausgabe von date +%e belegt (vergleiche Tabelle 1). Das folgende echo -e erlaubt die Verwendung von Escape-Sequenzen. Dazu gehören auch \n für einen Zeilenumbruch und \t für einen Tabulator. Das Kommando cal gibt den Kalender aus, wobei die Ausgabe in diesem Fall durch das Pipe-Zeichen “|” an den sed-Aufruf weitergeleitet wird. sed sucht jetzt in diesem Kalenderblatt den Abschnitt, der den Tag (die Ausgabe von date +%e) enthält und an einem Wortende (>, das ist der Regex-Ausdruck dafür) liegt. Er wird ersetzt durch ESC[31;7m (eine ANSI-Escape-Sequenz, die das Terminal auf rot und inverse Darstellung umschaltet), den Abschnitt selbst (&, das ist die sed-Referenz auf den ersetzten String) und ESC[39;0m (eine zweite Sequenz, die die Terminaldarstellung wieder zurücksetzt). Die zahllosen Backslashes sind nötig, um die Ausdrücke für die Shell und für sed passend zu maskieren.

Anschließend wird die Ausgabe von date +%d.%m der Variablen heute zugewiesen. Zunächst gibt das Skript das heutige Datum aus, dann schaltet es das Terminal auf rot um (ANSI-Sequenz). In der Datei ~/.birthdays sucht grep nach Zeilen, die mit dem Tagesdatum beginnen (“^$heute”). Zum Schluss wird das Terminal wieder auf normale Schriftfarbe zurückgestellt.

Die letzte Zeile des Skripts lässt sich in etwa so aufschlüsseln: Das Programm egrep (eine Variante von grep, die reguläre Ausdrücke beherrscht) sucht in ~/.birthdays nach Zeilen, die mit einer beliebigen Anzahl Ziffern (0 bis 9) beginnen, danach einen Punkt, den aktuellen Monat und wieder einen Punkt enthalten. Dabei bedeutet das “^”-Zeichen “am Zeilenanfang” und “[0-9]*” steht für beliebig viele Zeichen aus dem Bereich von 0 bis 9.

Ein Eintrag der Form

. ~/birthday.sh

in die Datei .profile sorgt dafür, dass das Skript bei jedem Login ausgeführt wird – so behalten Sie die wichtigen Daten immer im Auge.

Listing 1

Das Geburtstags-Skript

#!/bin/sh
heute_cal=`date +%e`
echo -e "`cal | sed s/"${heute_cal}\>"/\\\\\\\\e[31\;7m\&\\\\\\\\e[39\;0m/g`"
echo
heute=`date +%d.%m`
echo Heute ist der $heute, Geburtstag\(e\):
echo -e "\033[31m"; grep "^$heute" ~/.birthdays; echo -e "\033[0m"
morgen=`date -d tomorrow +%d.%m`
echo Morgen ist der $morgen, Geburtstag\(e\):
grep "^$morgen" ~/.birthdays
echo
dieser_Monat=`date +%m`
echo Im `date +%B` haben folgende Leute Geburtstag:
egrep "^[0-9]*\.$dieser_Monat\." ~/.birthdays

Glossar

Locales

Linux unterstützt verschiedene Ausgabesprachen für Programm- und Systemmeldungen, Datums- oder Währungsangaben. Die Namen aller auf Ihrem System installierten Lokalisierungen (engl.: locales) nennt Ihnen das “locale”-Kommando: “locale -a”.

CMOS

Complimentary Metal-Oxide Semiconductor. Der Timer-Chip, der die Systemzeit misst, läuft nicht weiter, wenn der Rechner ausgeschaltet ist. Alle PCs haben daher eine Batterie-betriebene Uhr, die das Datum und die Uhrzeit auch dann weiterzählt, wenn der Rechner ohne Stromversorgung ist. Da diese Uhr im gleichen Baustein wie das CMOS-RAM untergebracht ist, nennt man sie auch CMOS-Uhr. Andere gängige Bezeichnungen sind: Hardware-Uhr, RTC (Real Time Clock) oder BIOS-Uhr.

LinuxUser 06/2003 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben