Die meisten Operationen auf der Kommandozeile beziehen sich auf Dateien. In diesem Abschnitt behandeln wir das Betrachten und Filtern von Dateiinhalten, holen uns durch einfache Befehle benötigte Informationen aus Dateien und sortieren den Inhalt einer Datei.
Alle diese Befehle haben fast die gleiche Syntax: befehls_name [Option(en)] [Datei(en)]. Sie können auch mittels einer Pipe miteinander verbunden werden. Diese Befehle haben das gleiche Ziel: das Darstellen einer Datei nach bestimmten Kriterien.
Das Werkzeug cat verbindet Dateien und gibt das Resultat auf der Standardausgabe aus. Es ist eines der meistgenutzten Werkzeuge. Schreiben Sie beispielsweise
# cat /var/log/mail/info |
um den Inhalt des Mailtransport-Logs auf der Standardausgabe darzustellen[14]. cat besitzt eine sehr hilfreiche Option (-n), mit der bei der Ausgabe die Zeilen nummeriert werden.
Da einige Dateien, speziell Log-Dateien von Diensten (wenn diese aktiv sind), gewöhnlich recht umfangreich sind[15], ist die Ausgabe der gesamten Datei auf dem Bildschirm nicht sehr hilfreich. Normalerweise benötigen Sie nur die Ansicht einiger Zeilen aus solch einer Datei. Dazu können Sie den Befehl tail benutzen. Das folgende Kommando gibt standardgemäß die letzten 10 Zeilen der Datei (also etwa /var/log/mail/info) aus:
# tail /var/log/mail/info |
Mit der Option -n zeigen Sie die letzten n Zeilen einer Datei an, etwa die letzten beiden Zeilen:
# tail -n2 /var/log/mail/info |
Der Befehl head ist dem Befehl tail sehr ähnlich, zeigt aber die ersten Zeilen einer Datei. Mit dem folgenden Befehl zeigen Sie die ersten 10 Zeilen der Datei /var/log/mail/info an:
# head /var/log/mail/info |
Wie bei tail können Sie auch hier die Option -n zur Angabe der anzuzeigenden Zeilenanzahl einsetzen. Die ersten beiden Zeilen werden mit diesem Befehl angezeigt:
# head -n2 /var/log/mail/info |
Sie können diese beiden Befehle gemeinsam nutzen. Um etwa die Zeilen 9 und 10 anzuzeigen, lassen Sie head die ersten 10 Zeilen der Datei auswählen und schicken das Ergebnis dann durch eine Pipe zum Befehl tail.
# head /var/log/mail/info | tail -n2 |
Der zweite Teil des Kommandos wählt dann die letzten beiden Zeilen aus und stellt sie auf dem Bildschirm dar. In gleicher Weise wählen Sie die Zeile 20, gezählt vom Ende der Datei:
# tail -n20 /var/log/mail/info |head -n1 |
In diesem Beispiel weisen wir tail an, die letzten 20 Zeilen der Datei auszuwählen und sie durch eine Pipe an head zu übergeben. Der Befehl head zeigt dann die erste Zeile der ihm übergebenen Auswahl an.
Nehmen wir an, wir wollen das Resultat des letzten Beispiels auf dem Bildschirm darstellen und es gleichzeitig in der Datei results.txt speichern. Dabei hilft uns das Werkzeug tee. Dessen Syntax wie folgt lautet:
tee [Option(en)] [Datei] |
Jetzt können wir den vorherigen Befehl ändern:
# tail -n20 /var/log/mail/info |head -n1|tee results.txt |
Lassen Sie uns ein weiteres Beispiel ansehen. Wir wollen die letzten 20 Zeilen auswählen, sie in der Datei results.txt speichern, aber nur die erste der 20 Zeilen am Bildschirm ansehen. Dazu geben wir ein:
# tail -n20 /var/log/mail/info |tee results.txt |head -n1 |
Der Befehl tee besitzt eine hilfreiche Option (-a), die das Anhängen von Daten an eine existierende Datei ermöglicht.
Gehen wir zurück zum Befehl tail. Da laufende Dienste kontinuierlich neue Aktionen und Ereignisse in ihren Log-Dateien speichern, ändern sich diese Dateien dauernd. Wenn Sie diese Veränderungen der Log-Datei in Echtzeit verfolgen wollen nutzen Sie die Option -f von tail:
# tail -f /var/log/mail/info |
Hier werden alle Änderungen der Datei /var/log/mail/info sofort auf dem Bildschirm angezeigt. Diese Vorgehensweise ist besonders hilfreich, wenn man die Arbeitsweise des Systems beobachten will. Man kann beispielsweise bei der Verfolgung der Datei /var/log/messages die Meldungen des Systems und verschiedener Systemdienste beobachten.
Im nächsten Abschnitt werden wir zeigen, wie man mit Hilfe des Befehls grep die Meldungen des Postfix Dienstes aus allen anderen Meldungen herausfiltert.
Weder der Name noch die Abkürzung („General Regular Expression Parser“) sind sehr intuitiv, um so einfacher ist das, was dieser Befehl macht und wie er benutzt wird: grep durchsucht eine oder mehr Dateien nach einem angegebenen Muster. Die Syntax lautet:
grep [Option(en)] <muster> [Datei(en)] |
Werden mehrere Dateien angegeben, so wird im Suchergebnis der Name der jeweiligen Datei vor der jeweiligen Fundstelle angezeigt. Mit der Option -h schalten Sie diese Anzeige aus. Die Option -l bewirkt, dass nur die auf das Suchmuster passende Dateinamen ausgegeben werden. Das Muster ist ein regulärer Ausdruck, wenn es auch meist nur aus einem einfachen Wort besteht. Es folgen die meistgenutzten Optionen von grep:
Lassen Sie uns zur Untersuchung der Log-Datei des E-Mail-Dienstes zurückkehren. Wir wollen alle Zeilen in der Datei /var/log/mail/info finden, die das Muster „postfix“ enthalten. Dazu geben wir folgendes Kommando ein:
# grep postfix /var/log/mail/info |
Der grep-Befehl kann auch in einer Pipe benutzt werden. Daher bekommen wir das gleiche Resultat wie eben auch mit diesem Kommando:
# cat /var/log/mail/info | grep postfix |
Wenn wir alle Zeilen auflisten wollen, die das Muster „postfix“ nicht enthalten, benutzen wir die Option -v:
# grep -v postfix /var/log/mail/info |
Nehmen wir an, wir wollen alle Meldungen über erfolgreich versandte Mails finden. In diesem Fall müssen wir alle Zeilen der Log-Datei ausfiltern, die vom E-Mail Dienst stammen (also das Muster „postfix“ enthalten) und diese Zeilen nach der Meldung über einen erfolgreichen Versand („status=sent“) durchsuchen:
# grep postfix /var/log/mail/info |grep status=sent |
Hier wird grep zweimal nacheinander benutzt. Das ist zwar erlaubt aber nicht besonders elegant. Wir erreichen das gleiche Ergebnis mit dem Befehl fgrep. Zuerst müssen wir eine Datei mit den Suchmustern erstellen. Die Muster müssen darin in einer Spalte untereinander angeordnet sein. Diese Datei (wir benutzen den Namen patterns.txt) wird mit dem folgenden Kommando erstellt:
# echo -e 'status=sent\npostfix' >./patterns.txt |
Nun rufen wir das nächste Kommando auf, bei dem wir die Datei patterns.txt mit ihrer Liste der Suchmuster an das Werkzeug fgrep übergeben anstatt die „Doppelnutzung“ von grep anzuwenden:
# fgrep -f ./patterns.txt /var/log/mail/info |
Die Datei ./patterns.txt darf beliebig viele Suchmuster enthalten, wobei jedes Muster in einer Zeile für sich stehen muss. Um nun beispielsweise alle erfolgreich abgesandten Mails an peter@mandrakesoft.com zu finden, genügt es, mit folgendem Befehl die Mailadresse in die Datei ./patterns.txt einzufügen:
# echo 'peter@mandrakesoft.com' >>./patterns.txt |
Natürlich können Sie grep mit tail und head kombinieren. Die vorletzte Mail an peter@mandrakesoft.com finden Sie mit der folgenden Kommandozeile:
# fgrep -f ./patterns.txt /var/log/mail/info | tail -n2 | head -n1 |
Hier wenden wir den oben beschriebenen Filter an und schicken das Resultat über eine Pipe an die Befehle tail und head. Diese suchen dann den vorletzten Eintrag aus.
Der Befehl wc (Word Count) wird zum Erfassen der Anzahl von Zeichenfolgen und Wörtern in Dateien benutzt. Er hilft auch beim Zählen von Bytes, einzelnen Zeichen und beim Auffinden der längsten Zeile. Die Syntax ist wie folgt:
wc [Option(en)] [Datei(en)] |
Standardmäßig gibt der Befehl wc die Anzahl der Zeilen, Wörter und Zeichen aus. Es folgen einige Anwendungsbeispiele:
Gesucht wird die Anzahl der Benutzer in unserem System:
# wc -l /etc/passwd |
Gesucht wird die Anzahl der Prozessoren in unserem System:
# grep "model name" /proc/cpuinfo |wc -l |
Im vorigen Abschnitt ließen wir uns eine Liste der erfolgreich versandten Mails an Adressen in der Datei ./patterns.txt anzeigen. Wenn wir nun die Anzahl dieser Mails wissen wollen, können wir das Resultat des Filters durch eine Pipe an den Befehl wc schicken:
# fgrep -f ./patterns.txt /var/log/mail/info | wc -l |
Hier die Syntax dieses mächtigen Sotierwerkzeugs[16]:
sort [Option(en)] [Datei(en)] |
Lassen Sie uns einen Teil der Datei /etc/passwd sortieren. Wie Sie sehen können, ist der Inhalt nicht sortiert:
$ cat /etc/passwd |
Zur Sortierung nach dem Feld login verwenden wir den folgenden Befehl:
$ sort /etc/passwd |
Der Befehl sort sortiert, ohne Optionen gestartet, Daten in aufsteigender Folge, beginnend beim ersten Feld (in unserem Fall das Feld login). Wenn wir die Daten in absteigender Folge sehen wollen müssen wir die Option -r verwenden:
$ sort -r /etc/passwd |
Jeder Benutzer hat seine eigene UID in der Datei /etc/passwd. Lassen Sie uns die Datei in absteigender Folge nach dem Feld UID sortieren:
$ sort /etc/passwd -t":" -k3 -n |
In diesem Beispiel werden die folgenden sort Optionen verwendet:
Das Gleiche kann man natürlich auch in umgekehrter Folge machen:
# sort /etc/passwd -t":" -k3 -n -r |
sort hat zwei weitere wichtige Optionen:
Wenn wir schließlich den Benutzer mit der höchsten UID finden wollen, benutzen wir diese Befehlskette:
$ sort /etc/passwd -t":" -k3 -n |tail -n1 |
wobei wir die Datei /etc/passwd in aufsteigender Folge nach dem Feld UID sortieren und das Resultat durch eine Pipe an das Programm tail übergeben. Dieses gibt den ersten Wert der Liste aus.
[14] Einige Beispiele dieses Abschnitts basieren auf realistischen Arbeitsgängen mit Log-Dateien und Servern (Systemdiensten, Daemons). Dabei muss der Protokolldienst syslogd (er steuert die Logfunktion der Dienste) laufen. Für obiges Beispiel muss auch der E-Mail Dienst (etwa Postfix) laufen und Sie müssen als root angemeldet sein. Natürlich können Sie unsere Beispiele auch auf andere Dateien anwenden.
[15] So enthält beispielsweise die Datei /var/log/mail/info Informationen über alle gesendeten E-Mails, über den Empfang der Mails von Benutzern des POP-Protokolls, usw.
[16] Wir behandeln sort hier nur kurz, man könnte aber über die gesamten Eigenschaften ganze Bücher schreiben.