59
Leseprobe Dieser kurze Einblick liefert Ihnen die Grundvoraussetzungen für die Arbeit mit der Shell und zeigt Ihnen anhand einiger ausgewählter Kapitel die inhaltliche Tiefe des Buchs. Außerdem erhalten Sie das vollständige Inhalts- und Stichwortverzeichnis mit dem Überblick über die enthaltene Kommandoreferenz. Jürgen Wolf, Stefan Kania Shell-Programmierung – Das umfassende Handbuch 821 Seiten, gebunden, 5. Auflage 2016 39,90 Euro, ISBN 978-3-8362-4087-1 www.rheinwerk-verlag.de/4093 »Einführung« »Fehlersuche und Debugging« »Reguläre Ausdrücke und grep« »Der Stream-Editor sed« Inhaltsverzeichnis Index Die Autoren Leseprobe weiterempfehlen Wissen, wie’s geht.

Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

  • Upload
    docong

  • View
    216

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

LeseprobeDieser kurze Einblick liefert Ihnen die Grundvoraussetzungen für die Arbeit mit der Shell und zeigt Ihnen anhand einiger ausgewählter Kapitel die inhaltliche Tiefe des Buchs. Außerdem erhalten Sie das vollständige Inhalts- und Stichwortverzeichnis mit dem Überblick über die enthaltene Kommandoreferenz.

Jürgen Wolf, Stefan Kania

Shell-Programmierung – Das umfassende Handbuch821 Seiten, gebunden, 5. Auflage 2016 39,90 Euro, ISBN 978-3-8362-4087-1

www.rheinwerk-verlag.de/4093

»Einführung« »Fehlersuche und Debugging« »Reguläre Ausdrücke und grep« »Der Stream-Editor sed«

Inhaltsverzeichnis

Index

Die Autoren

Leseprobe weiterempfehlen

Wissen, wie’s geht.

Page 2: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

29

1Kapitel 1

1 Einführung

Als Autor eines Fachbuchs steht man immer vor der Frage, wo man

beginnen soll. Fängt man bei null an, so wird eine Menge Raum für

interessantere Aufgabenschwerpunkte verschenkt. Fordert man dem

Leser hingegen am Anfang gleich zu viel ab, läuft man Gefahr, dass

dieses Buch schnell im Regal verstaubt oder zur Versteigerung ange-

boten wird.

1.1 Was sollten Sie als Leser wissen?

Da Sie sich entschieden haben, mit der Shellscript-Programmierung anzufangen,

können wir davon ausgehen, dass Sie bereits ein wenig mit Linux bzw. einem UNIX-

artigen System vertraut sind. Vielleicht haben Sie auch schon Erfahrungen mit ande-

ren Programmiersprachen gemacht, was Ihnen hier einen gewissen Vorteil ver-

schafft. Vorhandene Programmiererfahrungen sind allerdings keine Voraussetzung,

um mit diesem Buch zu arbeiten. Es wurde so konzipiert, dass selbst ein Anfänger

recht einfach und schnell ans Ziel kommt. Dies haben wir deshalb getan, weil die

Shellscript-Programmierung im Gegensatz zu anderen Programmiersprachen wie

beispielsweise C/C++ oder Java erheblich einfacher zu erlernen ist (auch wenn Sie

beim ersten Durchblättern des Buchs einen anderen Eindruck haben sollten).

Aber was heißt »mit Linux bzw. UNIX bereits ein wenig vertraut«? Dass Sie folgende

Punkte beherrschen, müssen wir einfach von Ihnen erwarten – ansonsten könnte der

Buchtitel gleich »Linux/UNIX – Eine Einführung« lauten:

� An- und Abmelden am System

� Arbeiten mit einem (beliebigen) Texteditor (Mehr dazu folgt in Abschnitt 1.8.)

� Umgang mit Dateien und Verzeichnissen – sprich der Umgang mit den grundle-

genden Kommandos wie zum Beispiel cp, pwd, ls, cd, mv, mkdir, rmdir, cat ... (Sind

diese Kenntnisse nicht vorhanden, so ist das nicht weiter schlimm, denn alle Kom-

mandos werden in diesem Buch mehr als einmal verwendet und auch in einem

Crashkurs kurz beschrieben.)

� Zugriffsrechte – wer bin ich, was darf ich, und welche Benutzer gibt es? Oder ein-

fach: Was bedeuten die »komischen« Zeichen rwx bei den Dateien und Verzeich-

nissen? (Auch hierzu gibt es eine kurze Einführung.)

4087.book Seite 29 Freitag, 4. März 2016 1:00 13

Page 3: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

1 Einführung

30

� Verzeichnisstruktur – wo bin ich hier, und wo finde ich was? Wenn Sie nicht genau

wissen, wo Sie »zu Hause« sind oder wie Sie dorthin kommen, wird Ihnen die

ganze Umgebung ziemlich fremd vorkommen (aber auch ein Immigrant kann

sich einleben).

� grundlegende Kenntnisse eines Dateisystems – wo ist meine Festplatte, mein CD-

ROM- oder Diskettenlaufwerk, und vor allem: Wie werden diese bezeichnet? Wer

immer noch nach einem Laufwerk A, C oder D sucht, der dürfte mit diesem Buch

wieder einen Kandidaten für eBay gefunden haben.

� Kommunikation – das Buch behandelt auch netzwerkspezifische Dinge, weshalb

Sie zumindest den Weg in den »WeltWeitenWälzer« gefunden und den Umgang

mit der elektronischen Post bewältigt haben sollten.

Linux/UNIX-Kommandoreferenz

Sofern Sie mit einigen Shell-Kommandos, die bei den Scripts verwendet werden,

nicht zurechtkommen oder diese nicht kennen, finden Sie in Kapitel 14 eine Linux/

UNIX-Kommandoreferenz, in der Ihnen zumindest die Grundlagen (die gängigsten

Optionen) erläutert werden. Detailliertere Informationen bleiben selbstverständlich

weiterhin den Manualpages (Manpages) vorbehalten.

1.1.1 Zielgruppe

Mit diesem Buch wollen wir eine recht umfangreiche und keine spezifische Ziel-

gruppe ansprechen. Profitieren von der Shellscript-Programmierung kann jeder –

vom einfachen Linux/UNIX-Anwender bis hin zum absolut überbezahlten (oder häu-

fig auch schlecht bezahlten) Systemadministrator, also einfach jeder, der mit Linux/

UNIX zu tun hat bzw. vorhat, damit etwas mehr anzufangen.

Ganz besonders gut eignet sich die Shellscript-Programmierung auch für den Ein-

stieg in die Welt der Programmierung. Sie finden hier viele Konstrukte (Schleifen,

Bedingungen, Verzweigungen etc.), die auch in den meisten anderen Programmier-

sprachen in ähnlicher Form verwendet werden (wenn auch häufig die Syntax ein

wenig anders ist).

Da Sie sehr viel mit den »Bordmitteln« (Kommandos/Befehlen) des Betriebssystems

arbeiten, bekommen Sie auch ein gewisses Gefühl für Linux/UNIX. So haftet dem

Shellscript-Programmierer häufig ein Guru-Image an, einfach weil er tiefer in die Ma-

terie einsteigen muss als viele GUI-verwöhnte Anwender. Trotzdem ist es leichter,

die Shellscript-Programmierung zu erlernen als irgendeine andere Hochsprache, wie

beispielsweise C, C++, Java oder C#.

Die primäre Zielgruppe sind aber ganz klar Systemadministratoren und/oder Web-

master (mit SSH-Zugang). Für einen Systemadministrator von Linux/UNIX-Sys-

4087.book Seite 30 Freitag, 4. März 2016 1:00 13

1.1 Was sollten Sie als Leser wissen?

31

1temen ist es häufig unumgänglich, sich mit der Shellscript-Programmierung ausei-

nanderzusetzen. Letztendlich ist ja auch jeder einzelne Linux/UNIX-(Heim-)Benutzer

mit einem PC ein Systemadministrator und profitiert enorm von den neu hinzuge-

wonnenen Kenntnissen.

OS X ist auch UNIX

Natürlich dürfen sich auch die Mac-Anwender angesprochen fühlen. Alles, was wir

hier im Buch beschreiben, wurde sorgfältig auf OS X (Version 10.10) getestet. Speziell

bei dieser fünften Auflage des Buches wurde ganz besonders auf die Mac-Kompati-

bilität geachtet, und natürlich wird bei Bedarf auf die Unterschiede eingegangen.

Auch werden wir Ihnen erklären, wie Sie die Bash-Version 4 auf Ihrem Mac installie-

ren und nutzen können.

1.1.2 Notation

Die hier verwendete Notation ist recht einfach und zum Teil eindeutig aufgebaut.

Wenn die Eingabe mit der Tastatur (bzw. einer Tastenkombination) beschrieben

wird, wird das mit einem entsprechenden Tasten-Zeichen gekennzeichnet. Wenn Sie

beispielsweise (Strg)+(C) lesen, so bedeutet dies, dass hier die Tasten »Steuerung«

(Control oder auch (Ctrl)) und »C« gleichzeitig gedrückt wurden; finden Sie (Esc)

vor, dann ist das Drücken der Escape-Taste gemeint.

Tastenbelegung bei OS X

Während die Tastenbelegung und -verwendung bei Windows- und Linux- und vielen

UNIX-Systemen recht ähnlich ist, hat ein Mac-System eine geringfügig andere Tasta-

tur. Auf die Unterschiede zwischen einer Mac- und einer PC-Tastatur gehen wir kurz

in Abschnitt C.1 ein. An dieser Stelle weisen wir daher nur kurz darauf hin, dass eine

Tastenkombination wie (Strg)+(C) auf dem Mac mit (ctrl)+(C) ausgeführt wer-

den muss und nicht, wie Sie vielleicht annehmen, mit (cmd)+(C). Mac-Veteranen

wissen das zwar, aber da das System immer beliebter wird und es somit mehr

Umsteiger gibt, sollte dies hier kurz erwähnt werden.

Sie werden sehr viel mit der Shell arbeiten. Als Shell-Prompt des normalen Users in

der Kommandozeile wird you@host > verwendet. Diesen Prompt müssen Sie also

nicht bei der Eingabe mit angeben (logisch, aber es sollte erwähnt werden). Wird hin-

ter diesem Shell-Prompt die Eingabe in fetten Zeichen dargestellt, so handelt es sich

um eine Eingabe in der Kommandozeile, die vom Benutzer (meistens von Ihnen)

vorgenommen und mit einem (¢)-Tastendruck bestätigt wurde.

you@host > Eine_Eingabe_in_der_Kommandozeile

4087.book Seite 31 Freitag, 4. März 2016 1:00 13

Page 4: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

1 Einführung

32

Folgt hinter dieser Zeile eine weitere Zeile ohne den Shell-Prompt you@host > und

nicht in fetter Schrift, dann handelt es sich in der Regel um die erzeugte Ausgabe der

zuvor getätigten Eingabe (was im Buch meistens den Aktionen Ihres Shellscripts ent-

spricht).

you@host > Eine_Eingabe_in_der_KommandozeileDie erzeugte Ausgabe

Finden Sie stattdessen das Zeichen # als Shell-Prompt, dann handelt es sich um einen

Prompt des Superusers (root). Selbstverständlich setzt dies voraus, dass Sie auch die

entsprechenden Rechte haben. Dies ist nicht immer möglich und wird daher in die-

sem Buch so selten wie möglich eingesetzt.

you@host > whoaminomaler_Useryou@host > suPasswort: ********# whoamiroot# exityou@host > whoaminormaler_User

Vorübergehende Root-Rechte mit sudo

Viele UNIX-artige Betriebssysteme wie Linux oder OS X gehen hier einen anderen

Weg und verwenden den Befehl sudo (substitute user do oder super user do). Mit die-

sem Befehl können Sie einzelne Programme bzw. Kommandos mit den Rechten

eines anderen Benutzers (beispielsweise mit Root-Rechten) ausführen. Der Befehl

sudo wird dabei vor den eigentlich auszuführenden Befehl geschrieben. Wollen Sie

für mehr als nur einen Befehl als Superuser arbeiten, können Sie mit sudo -s dauer-

haft wechseln. Die Einstellungen für sudo werden in der Datei /etc/sudoers gespei-

chert. Mehr Informationen zu sudo finden Sie auf der entsprechenden Manualpage

oder auf der offiziellen Webseite (http://www.sudo.ws).

1.2 Was ist eine Shell?

Für den einen ist eine Shell nichts anderes als ein besseres »command.com« aus

der MS-DOS-Welt. Ein anderer wiederum bezeichnet die Shell lediglich als Kom-

mandozeile, und für einige ist die Shell die Benutzeroberfläche schlechthin. Diese

Meinungen resultieren daraus, dass die einen die Shell lediglich dazu verwenden,

Installations- bzw. Konfigurationsscripts auszuführen. Andere verwenden auch

4087.book Seite 32 Freitag, 4. März 2016 1:00 13

1.2 Was ist eine Shell?

33

1häufiger mal die Kommandozeile zum Arbeiten, und die letzte Gruppe setzt die

Shell so ein, wie andere Anwender die grafischen Oberflächen benutzen.

Für die meisten User besteht eine Benutzeroberfläche aus einem Fenster oder meh-

reren Fenstern, die man mit der Maus oder der Tastatur steuern kann. Wie kann man

(oder der Autor) also behaupten, die Shell sei eine Benutzeroberfläche? Genauer

betrachtet, ist eine Benutzeroberfläche nichts anderes als eine Schnittstelle, die zwi-

schen der Hardware des Systems (mit der der normale Benutzer nicht gern direkt

etwas zu tun haben will, was er auch nicht sollte) und dem Betriebssystem kommu-

niziert. Dies ist natürlich relativ einfach ausgedrückt, denn in Wirklichkeit findet eine

solche Kommunikation meistens über mehrere abstrakte Schichten statt. Der Benut-

zer gibt eine Anweisung ein, diese wird interpretiert und in einen Betriebssystemauf-

ruf umgewandelt, der auch System-Call oder Sys-Call genannt wird. Jetzt wird auf die

Rückmeldung des Systems gewartet und ein entsprechender Befehl umgesetzt – oder

im Fall eines Fehlers eine Fehlermeldung ausgegeben.

Kommandozeileneingabe

Noch genauer gesagt durchläuft eine Eingabe der Kommandozeile einen Interpreter

und ist somit praktisch nichts anderes als ein Shellscript, das von der Tastaturein-

gabe aus, ohne es zwischenzuspeichern, in einem Script ausgeführt wird.

Man spricht dabei auch von einem Systemzugang. Einen solchen Systemzugang

(Benutzeroberfläche) können Sie als normaler Benutzer wie folgt erlangen:

� über die Kommandozeile (Shell): Hierbei geben Sie in einem Fenster (beispiels-

weise xterm) oder häufig auch in einem Vollbildschirm (eben einem echten tty)

über die Tastatur entsprechende Kommandos ein und setzen so die Betriebssys-

temaufrufe in Gang.

� über die grafische Oberfläche (Windowmanager wie X11, KDE, GNOME etc.): Auch

hierbei geben Sie mit der Maus oder der Tastatur Anweisungen (Kommandos) ein,

die auf der Betriebssystemebene ebenfalls nicht vorbeikommen.

Kommandozeile und Interpreter

Häufig wird die Kommandozeile als Shell bezeichnet. Diese Shell ist aber nicht gleich-

zusetzen mit dem »Interpreter« Shell. Der Interpreter ist die Schnittstelle, durch die

überhaupt erst die Kommunikation zwischen der Ein-/Ausgabe und dem System

möglich wird.

Auch wenn es auf den ersten Blick den Anschein hat, dass man über die grafische

Oberfläche den etwas schnelleren und bequemeren Weg gewählt hat, so ist dies häu-

fig nicht so. Je mehr Erfahrung ein Anwender hat, desto eher wird er mit der Kom-

mandozeile schneller ans Ziel kommen als der GUI-gewöhnte Anwender.

4087.book Seite 33 Freitag, 4. März 2016 1:00 13

Page 5: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

1 Einführung

34

Hurra, die ganze Arbeit war umsonst: KDE und GNOME benötigen wir nicht mehr,

und die fliegen jetzt von der Platte! Nein, keine Sorge, wir wollen Sie keinesfalls von

der grafischen Oberfläche abbringen, ganz im Gegenteil. Gerade ein Mix aus grafi-

scher Oberfläche und Kommandozeile macht effektiveres Arbeiten erst möglich. Wie

sonst wäre es z. B. zu realisieren, mehrere Shells gleichzeitig zur Überwachung zu be-

trachten bzw. einfach mehrere Shells gleichzeitig zu verwenden?

Langer Rede kurzer Sinn: Eine Shell ist eine Methode, das System über die Komman-

dozeile zu bedienen.

Historisch interessierte User werden sich wohl fragen, wieso die Bezeichnung »Shell«

(was so viel wie »Muschel« oder auch »Schale« bedeutet) verwendet wurde. Der

Name bürgerte sich unter Linux/UNIX (eigentlich war zuerst UNIX da, aber auf diese

Geschichte wird hier nicht eingegangen) ein, weil sich eine Shell wie eine Schale um

den Betriebssystemkern legt.

Vereinfacht ausgedrückt ist die Shell ein vom Betriebssystemkern unabhängiges Pro-

gramm bei der Ausführung – also ein simpler Prozess. Ein Blick auf das Kommando

ps (ein Kommando, mit dem Sie Informationen zu laufenden Prozessen ermitteln

können) bestätigt Ihnen das:

you@host > psPID TTY TIME CMD5890 pts/40 00:00:00 bash5897 pts/40 00:00:00 ps

Hier läuft als Shell beispielsweise die Bash – aber mehr zu den verschiedenen Shells

und der Ausgabe von ps erfahren Sie etwas später.

Shell bei OS X aufrufen

Bei OS X können Sie ein Terminal mit der Standard-Shell (der Bash) über den Ordner /

Programme/Dienstprogramme/ aufrufen. Tipp: Schneller können Sie in das Verzeich-

nis Dienstprogramme wechseln, wenn Sie im Finder die Tastenkombination

(cmd)+(ª)+(U) betätigen. Eine Alternative ist auf jeden Fall iterm. Die aktuellste

Version finden Sie unter https://www.iterm2.com/.

Natürlich kann man die Shell nicht einfach als normalen Prozess bezeichnen, dazu ist

sie ein viel zu mächtiges und flexibles Programm. Selbst der Begriff »Kommando-

zeile« ist ein wenig zu schwach. Eher schon würde sich der Begriff »Kommandospra-

che« eignen. Und wenn die Shell schon nur ein Programm ist, sollte erwähnt werden,

dass sie auch jederzeit gegen eine andere Shell ausgetauscht werden kann. Es gibt

also nicht nur die eine Shell, sondern mehrere – aber auch hierzu sagen wir in Kürze

mehr.

4087.book Seite 34 Freitag, 4. März 2016 1:00 13

1.3 Hauptanwendungsgebiet

35

11.3 Hauptanwendungsgebiet

Dass eine Shell als Kommandosprache oder als Scriptsprache eine bedeutende Rolle

unter Linux/UNIX spielt, dürfte Ihnen bereits bekannt sein. Wichtige Dinge, wie die

Systemsteuerung oder die verschiedenen Konfigurationen, werden über die Shell

(und die damit erstellten Shellscripts, also die Prozeduren) realisiert.

Vor allem werden Shellscripts auch dazu verwendet, täglich wiederkehrende Aufgaben

zu vereinfachen und Vorgänge zu automatisieren. Dies schließt die Hauptanwen-

dungsgebiete wie (System-)Überwachung von Servern, das Auswerten von bestimm-

ten Dateien (Log-Dateien, Protokollen, Analysen, Statistiken, Filterprogrammen etc.)

und ganz besonders die Systemadministration mit ein – alles Dinge, mit denen sich

beinahe jeder Anwender (ob bewusst oder unbewusst) auseinandersetzen muss.

Es kann ganz plausible Gründe dafür geben, ein Shellscript zu erstellen. Auch bei ein-

fachsten Eingaben in der Kommandozeile, die Sie dauernd durchführen, können Sie

sich das Leben dadurch erleichtern, dass Sie diese Kommandos zusammenfassen

und einfach ein »neues« Kommando oder, etwas exakter formuliert, ein Shellscript

schreiben.

1.3.1 Was ist ein Shellscript?

Bestimmt haben Sie das eine oder andere Mal schon ein Kommando oder eine Kom-

mandoverkettung in der Shell eingegeben, zum Beispiel:

you@host > ls /usr/include | sort | lessaf_vfs.haio.haliases.halloca.hansidecl.ha.out.hargp.hargz.h...

Tatsächlich stellt diese Kommandoverkettung schon ein Programm bzw. Script dar.

Hier lenken Sie z. B. mit ls (womit Sie den Inhalt eines Verzeichnisses auflisten kön-

nen) die Ausgabe aller im Verzeichnis /usr/include enthaltenen Dateien mit einer

Pipe an das Kommando sort weiter. sort sortiert die Ausgabe des Inhalts von /usr/

include, dessen Daten ja vom Kommando ls kommen, lexikografisch. Auch die Aus-

gabe von sort wird nochmals durch eine Pipe an less weitergegeben, also an den

Pager, mit dem Sie die Ausgabe bequem nach oben bzw. unten scrollen können. Zu-

sammengefasst könnten Sie jetzt diese Befehlskette in einer Datei (einem Script)

4087.book Seite 35 Freitag, 4. März 2016 1:00 13

Page 6: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

1 Einführung

36

speichern und mit einem Aufruf des Dateinamens jederzeit wieder starten (hierauf

wird noch ausführlicher eingegangen). Rein theoretisch hätten Sie hiermit schon ein

Shellscript erstellt. Wäre dies alles, so müssten Sie kein ganzes Buch lesen und könn-

ten gleich auf das Kommando alias oder ein anderes bequemeres Mittel zurückgrei-

fen. Für solch einfache Aufgaben müssen Sie nicht extra ein Shellscript schreiben. Ein

Shellscript wird allerdings unter anderem dann nötig, wenn Sie

� Befehlssequenzen mehrmals ausführen wollen.

� aufgrund einer bestimmten Bedingung einen Befehl bzw. eine Befehlsfolge aus-

führen wollen.

� Daten für weitere Bearbeitungen zwischenspeichern müssen.

� eine Eingabe vom Benutzer benötigen.

Für diese und andere Aufgaben finden Sie bei einer Shell noch zusätzliche Kon-

strukte, wie sie ähnlich auch in anderen Programmiersprachen vorhanden sind.

Natürlich dürfen Sie nicht den Fehler machen, die Shellscript-Programmierung mit

anderen höheren Programmiersprachen gleichzusetzen. Aufwendige und schnelle

Grafiken, zeitkritische Anwendungen und eine umfangreiche Datenverwaltung

(Stichwort: Datenbank) werden weiterhin mit Programmiersprachen wie C oder C++

erstellt.

Grafische Oberfläche mit Shellscripts

Wer jetzt denkt, die Shellscript-Programmierung sei nur eine »graue Maus«, der

täuscht sich. Auch mit ihr lassen sich, wie in jeder anderen Sprache auch, Scripts mit

einer grafischen Oberfläche erstellen. Ein Beispiel dazu finden Sie in Kapitel 16, »GUIs

und Grafiken«, mit Xdialog.

Ein Shellscript ist also nichts anderes als eine mit Shell-Kommandos zusammenge-

bastelte (Text-)Datei, bei der Sie entscheiden, wann, warum und wie welches Kom-

mando oder welche Kommandosequenz ausgeführt wird.

Dennoch kann ein Shellscript, je länger es wird und je komplexer die Aufgaben wer-

den, auf den ersten Blick sehr kryptisch und kompliziert sein. Dies sagen wir nur für

den Fall, dass Sie vorhaben, das Buch von hinten nach vorne durchzuarbeiten.

1.3.2 Vergleich mit anderen Sprachen

Das Vergleichen von Programmiersprachen war schon immer ein ziemlicher Irrsinn.

Jede Programmiersprache hat ihre Vor- und Nachteile und dient letztendlich immer

als Mittel, um eine bestimmte Aufgabe zu erfüllen. Somit hängt die Wahl der Pro-

grammiersprache davon ab, welche Aufgabe sich Ihnen stellt.

4087.book Seite 36 Freitag, 4. März 2016 1:00 13

1.3 Hauptanwendungsgebiet

37

1Zumindest können wir ohne Bedenken sagen, dass Sie mit einem Shellscript kom-

plexe Aufgaben erledigen können, für die sich andere Programmiersprachen kaum

bis gar nicht eignen. In keiner anderen Sprache haben Sie die Möglichkeit, die unter-

schiedlichsten Linux/UNIX-Kommandos zu verwenden und so zu kombinieren, wie

Sie es gerade benötigen. Einfachstes Beispiel: Geben Sie den Inhalt von einem Ver-

zeichnis in lexikografischer Reihenfolge aus. Bei einem Shellscript geht dies mit ei-

nem einfachen ls | sort – würden Sie Selbiges in C oder C++ erstellen, wäre dies, wie

mit Kanonen auf Spatzen zu schießen.

Auf Umwegen zum Ziel kommen

Aber das soll nicht heißen, etwas Derartiges in C zu schreiben sei sinnlos – der Lern-

effekt ist hierbei sehr gut. Allerdings scheint uns dieser Weg für denjenigen, der

eben »nur« ans Ziel kommen will bzw. muss, ein ziemlicher Umweg zu sein. Da wir

uns selbst auch sehr viel mit C beschäftigen, müssen wir eingestehen, dass wir

natürlich auch häufig mit »Kanonen auf Spatzen geschossen« haben und es immer

noch gern tun.

Allerdings haben auch Shellscript-Programme ihre Grenzen. Dies trifft ganz beson-

ders auf Anwendungen zu, von denen eine enorme Menge an Daten auf einmal ver-

arbeitet werden muss. Werden diese Arbeiten dann auch noch innerhalb von

Schleifen ausgeführt, dann kann dies schon mal recht langsam werden. Zwar wer-

den Sie auf einem Einzelplatzrechner recht selten auf solche Engpässe stoßen, aber

sobald Sie Ihre Scripts in einem Netzwerk, wie beispielsweise auf einem Server

schreiben, auf dem sich eine Menge weiterer Benutzer (etwa bei einem Webhoster

mit SSH) befinden, dann sollten Sie überlegen, ob sich nicht eine andere Program-

miersprache besser eignet. Häufig wird als nächstbessere Alternative und als min-

destens genauso flexibel Perl genannt.

Der Vorteil von Perl ist, dass häufig keine Kommandos oder externen Tools gestartet

werden müssen, weil Perl so ziemlich alles beinhaltet, was man braucht. Und wer in

den Grundfunktionen von Perl nicht das findet, was er sucht, dem bleibt immer noch

ein Blick in das mittlerweile unüberschaubare Archiv von CPAN-Modulen (CPAN =

Comprehensive Perl Archive Network).

Allerdings sind Scriptsprachen immer etwas langsamer. Der Grund liegt darin, dass

sie interpretiert werden müssen. Schreiben Sie beispielsweise ein Shellscript, so wird

es beim Ausführen Zeile für Zeile analysiert. Dies beinhaltet unter anderem eine

Überprüfung der Syntax und zahlreiche Ersetzungen.

Wenn es auf die Performance ankommt oder zeitkritische Daten verarbeitet werden

müssen, weicht man meistens auf eine »echte« Programmiersprache wie C oder C++

aus. Wobei es den Begriff »echte« Programmiersprache (auch Hochsprache genannt)

so gar nicht gibt. Häufig ist davon bei Sprachen die Rede, die kompiliert und nicht

4087.book Seite 37 Freitag, 4. März 2016 1:00 13

Page 7: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

1 Einführung

38

mehr interpretiert werden. Kompilierte Sprachen haben den großen Vorteil, dass die

Abarbeitung von Daten in und mit einem einzigen (binären) Programm erfolgt.

Programmiersprachen

Genauer wollen wir hier gar nicht mehr auf die Unterschiede einzelner Programmier-

sprachen eingehen.

Falls Sie trotzdem an anderen Programmiersprachen (beispielsweise C) interessiert

sind, möchten wir Ihnen Jürgen Wolfs Buch »C von A bis Z« empfehlen, das ebenfalls

im Rheinwerk Verlag erschienen ist. Eine vollständige HTML-Version davon finden

Sie zum Download unter https://www.rheinwerk-verlag.de/shell-programmierung_

4093/ im Kasten Materialien im Buch.

1.4 Kommando, Programm oder Shellscript?

Solange man nichts mit dem Programmieren am Hut hat, verwendet man alles, was

irgendwie ausführbar ist (mehr oder weniger). Irgendwann hat man Feuer gefangen

und in die eine oder andere Sprache hineingeschnuppert, und dann stellt sich die

Frage: Was ist es denn nun – ein Kommando (Befehl), ein Programm, ein Script oder

was? Die Unterschiede sind für Laien gar nicht so leicht ersichtlich. Da eine Shell als

Kommando-Interpreter arbeitet, kennt sie mehrere Arten von Kommandos, die

Ihnen hier ein wenig genauer erläutert werden sollen.

1.4.1 Shell-eigene Kommandos (Builtin-Kommandos)

Shell-eigene Kommandos sind Kommandos, die in der Shell direkt implementiert

sind und auch von ihr selbst ausgeführt werden, ohne dass dabei ein weiteres Pro-

gramm gestartet werden muss. Die Arten und der Umfang dieser Builtins hängen

vom verwendeten Kommando-Interpreter ab (was meistens die Shell selbst ist). So

kennt die eine Shell einen Befehl, den die andere nicht beherrscht. Einige dieser

Kommandos müssen sogar zwingend Teil einer Shell sein, da diese globale Variablen

verwendet (wie beispielsweise cd mit den Shell-Variablen PWD und OLDPWD). Weitere

Kommandos werden wiederum aus Performance-Gründen in der Shell ausgeführt.

1.4.2 Aliase in der Shell

Ein Alias ist ein anderer Name für ein Kommando oder eine Kette von Kommandos.

Solch einen Alias können Sie mit einer selbst definierten Abkürzung beschreiben, die

von der Shell während der Substitution durch den vollen Text ersetzt wird. Sinnvoll

4087.book Seite 38 Freitag, 4. März 2016 1:00 13

Page 8: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

403

10

Kapitel 10

10 Fehlersuche und Debugging

Sicherlich haben Sie im Verlauf der vielen Kapitel beim Tippen und

Schreiben von Scripts genauso viele Fehler gemacht wie wir und sich

gefragt: »Was passt denn jetzt wieder nicht?« Auch hier gilt, dass Feh-

ler beim Lernen nichts Schlechtes sind. Aber sobald Sie Ihre Scripts auf

mehreren oder fremden Rechnern ausführen, sollten Fehler nicht

mehr vorkommen. Daher finden Sie in diesem Kapitel einige Hinweise,

wie Sie Fehler vermeiden können und – wenn sie bereits aufgetreten

sind – wie Sie ihnen auf die Schliche kommen.

10.1 Strategien zum Vermeiden von Fehlern

Sicherlich, Fehler gänzlich vermeiden können Sie wohl nie, aber es gibt immer ein

paar grundlegende Dinge, die Sie beherzigen können, um wenigstens den Überblick

zu behalten.

10.1.1 Planen Sie Ihr Script

Zugegeben, bei einem Mini-Script von ein paar Zeilen werden Sie wohl kaum das

Script planen. Allerdings haben wir persönlich schon die Erfahrung gemacht, dass ein

geplantes Script wesentlich schneller erstellt ist als ein aus dem Kopf geschriebenes.

Eine solche Planung hängt natürlich vom entsprechenden »Kopf« und dem An-

wendungsfall ab. Aber das Prinzip ist einfach. Zuerst schreiben Sie auf (oder kritzeln

hin), was das Script machen soll.

Ein Beispiel: Das Script soll auf mehreren Rechnern eingesetzt werden und ein

Backup der Datenbank erstellen. Das Backup soll hierbei in einem separaten Ver-

zeichnis gespeichert werden, und bei mehr als zehn Backup-Dateien soll immer die

älteste gelöscht werden.

Auch wenn man sich bei den ersten Gedanken noch gar nicht vorstellen kann, wie

das Script funktionieren bzw. aussehen soll, kann man trotzdem schon mit der Pla-

nung beginnen. Zwar haben Sie jetzt noch keine Zeile Code geschrieben, doch Sie

werden feststellen, dass diese Liste schon die halbe Miete ist. Und wenn Sie merken,

4087.book Seite 403 Freitag, 4. März 2016 1:00 13

Page 9: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

404

dass Sie das Script mit dem derzeitigen Wissensstand nicht realisieren können, wis-

sen Sie wenigstens, wo sich Ihre Wissenslücken befinden, und können entsprechend

nachhelfen.

#---------------------------------------------------------------#Plan zum Backup-Script:

1.) Prüfen, ob das Verzeichnis für das Backup existiert (test) undggf. das Verzeichnis neu anlegen (mkdir).

2.) Da mehrere Dateinamen (zehn) in einem Verzeichnis verwendetwerden, einen entsprechenden Namen zur Laufzeit mit 'date'erstellen und in einer Variablen speichern (date).

3.) Einen Dump der Datenbank mit mysqldump und den entsprechendenOptionen erstellen (mysqldump).

4.) Den Dump gleich in das entsprechende Verzeichnis packen undarchivieren (tar oder cpio). !!! Dateinamen beachten !!!

5.) Ggf. Datenreste löschen.6.) Verzeichnis auf Anzahl von Dateien überprüfen (ls -l | wc -l)

und ggf. die älteste Datei löschen.

Notizen: Bei Fertigstellung crontab aktivieren – täglich um01.00 Uhr ein Backup erstellen.

#---------------------------------------------------------------#

10.1.2 Testsystem bereitstellen

Bevor Sie Ihr Script nach der Fertigstellung dem Ernstfall überlassen, sollten Sie auf

jeden Fall das Script lokal oder auf einem Testsystem testen. Gerade Operationen auf

einer Datenbank oder schreibende Zugriffe auf Dateien sollte man möglichst vor-

sichtig behandeln. Denn wenn irgendetwas schiefläuft, ist dies auf Ihrem Testsystem

nicht so schlimm, aber bei einem oder gar mehreren Rechnern könnte solch ein Feh-

ler Sie eine Menge Ärger, Zeit und vor allem Nerven kosten. Es wäre auch sinnvoll,

wenn Sie mehrere verschiedene Testsysteme zum Ausprobieren hätten – denn was

auf Ihrer Umgebung läuft, muss nicht zwangsläufig auch auf einer anderen Umge-

bung laufen. Gerade wenn man häufig zwischen Linux und UNIX wechselt, gibt es

hier und da doch einige Differenzen.

10.1.3 Ordnung ist das halbe Leben

Dass sich nicht alle an das Motto aus unserer Überschrift halten, zeigt folgendes

Script:

4087.book Seite 404 Freitag, 4. März 2016 1:00 13

10.1 Strategien zum Vermeiden von Fehlern

405

10

# Eine Datei anlegen# Name: creatfile

CreatFile=atestfile.txt

if [ ! -e $CreatFile ]thentouch $CreatFileif [ ! -e $CreatFile ] ; thenecho "Konnte $CreatFile nicht anlegen" ; exit 1fifi

echo "$CreatFile angelegt/vorhanden!"

Zugegeben, das Script ist kurz und im Prinzip auch verständlich, doch wenn Sie solch

einen Programmierstil über längere Scripts beibehalten, werden Sie allein bei der

Fehlersuche keine große Freude haben. Folgende Punkte fallen auf den ersten Blick

negativ auf:

� Es gibt keine Einrückungen bei den if-Anweisungen; es fehlt einfach an Struktur.

� Mehrere Befehle stehen in einer Zeile. Bei einer Fehlermeldung wird die Zeilen-

nummer mit ausgegeben. Befinden sich darin mehrere Kommandos, wird die Feh-

lersuche erschwert.

� In diesem Script wurde die MS-übliche ungarische Notation verwendet, die in der

Praxis sehr fehleranfällig sein kann. Hat man vergessen, wie die Variable CreatFile

geschrieben wurde, und schreibt creatfile oder creat_file, so ergibt sich schon

ein Fehler. Wer schon einmal die Win32-API zur Programmierung verwendet hat,

der weiß, was wir meinen.

� Die Faulheit hat gesiegt; der Anwender weiß nach dem Script immer noch nicht,

ob eine Datei angelegt wurde oder bereits vorhanden ist.

� Kommentarlose Scripts sind schwer zu pflegen. Schreiben Sie besser den ein oder

anderen (vielleicht überflüssigen) Kommentar hin als gar keinen.

Hier sehen Sie das Script in einem etwas lesbareren Stil:

# Eine Datei anlegen# Name: creatfile2

# Datei, die angelegt werden sollcreatfile=atestfile.txt

4087.book Seite 405 Freitag, 4. März 2016 1:00 13

Page 10: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

406

# Existiert diese Datei bereits ...if [ ! -e $creatfile ]then # Nein ...

touch $creatfile # Datei anlegen ...# Jetzt nochmals überprüfen ...if [ ! -e $creatfile ]then

echo "Konnte $creatfile nicht anlegen"exit 1 # Script erfolglos beenden

elseecho "$creatfile erfolgreich angelegt"

fifi

echo "$creatfile vorhanden!"

Das sieht doch schon viel besser aus. Natürlich kann Ihnen niemand vorschreiben, in

welchem Stil Sie Ihre Scripts schreiben, dennoch wollen wir Ihnen hier einige Hinwei-

se ans Herz legen, mit denen Sie (gerade, wenn Sie vielleicht noch Anfänger sind) ein

friedlicheres Shell-Leben führen können.

Variablen und Konstanten

Verwenden Sie einen sinnvollen Namen für eine Variable – mit x, y oder z kann nie-

mand so recht etwas anfangen. Verwenden Sie beispielsweise Variablen in einer

Funktion namens removing(), könnten Sie Variablen wie rem_source, rem_dest oder

rem_temp verwenden. Hier gibt es viele Möglichkeiten, nur sollten Sie immer versu-

chen, dass Sie einer Variablen einen Namen geben, an dem man erkennt, was sie be-

deutet – eine Variable benötigt also ein klar zu erkennendes Merkmal.

Außerdem sollten Sie Konstanten und Variablen auseinanderhalten. Wir bezeichnen

hier Konstanten nicht als Variablen, die mit typeset als »readonly« markiert wurden,

sondern meinen Variablen, die sich zur Laufzeit des Scripts nicht mehr ändern. Ein

guter Stil wäre es beispielsweise, Variablen, die sich im Script nicht mehr ändern,

großzuschreiben (wer hat hier was von C gesagt?) und normale Variablen klein. So

kann man im Script schnell erkennen, welche Werte sich ohnehin nicht verändern

und welche Werte variabel sind. Dies kann die Fehlersuche eingrenzen, weil konstan-

te Variablen nicht verändert werden und man in diesen auch keine falschen Werte

vermutet (es sei denn, man gibt diesen Variablen gleich zu Beginn einen falschen

Wert).

4087.book Seite 406 Freitag, 4. März 2016 1:00 13

10.2 Fehlerarten

407

10

Stil und Kommentare

Hier gibt es nur eines zu sagen: Es hat noch niemandem geschadet, einmal mehr auf

(¢) und eventuell mal auf die (häufig noch wie neue) Tabulatortaste zu drücken. Wir

empfehlen Ihnen, eine Anweisung bzw. ein Schlüsselwort pro Zeile zu verwenden.

Dies hilft Ihnen, bei einer Fehlermeldung gleich die entsprechende Zeile anzusprin-

gen und zu lokalisieren. Ebenfalls sollten Sie der Übersichtlichkeit zuliebe Anwei-

sungs- oder Funktionsblöcke einrücken.

Das Problem mit einem kaum kommentierten Code kennt man zur Genüge. Jürgen

hatte zum Beispiel früher sehr viel mit Perl zu tun. Nach einem Jahr Abstinenz (und

vielen anderen Programmiersprachen) benötigte er nur ein paar Zeilen aus einem

Script, das er mal geschrieben hatte. Leider hatte er den Code nicht kommentiert,

und so gestaltete sich das »Entschlüsseln« etwas länger bzw. benötigte Jürgen wie-

der den Rat anderer Personen. Mit der Verwendung von Kommentaren hätte er ei-

niges an Zeit gespart. Bei der Shellscript-Programmierung ist das genauso. Sie wer-

den schließlich noch etwas anderes zu tun haben, als immer nur Shellscripts zu

schreiben.

Und: Es gibt auch noch das Backslash-Zeichen, von dem Sie immer dann Gebrauch

machen sollten, wenn eine Zeile mal zu lang wird oder wenn Sie Ketten von Kom-

mandos mit Pipes verwenden. Dies erhöht die Übersicht ebenfalls enorm.

10.2 Fehlerarten

Wenn das Script fertiggestellt ist und es treten Fehler auf, unterscheidet man gewöhn-

lich zwischen mehreren Fehlerarten:

� Syntaxfehler – Der wohl am häufigsten auftretende Fehler ist ein Syntaxfehler.

Hierbei reicht ein einfacher Tippfehler beispielsweise in einem Schlüsselwort aus.

Wenn Sie einmal thn statt then schreiben, haben Sie schon einen Syntaxfehler. Lei-

der lassen sich solche Fehler häufig nicht so einfach finden. Beispielsweise gibt bei

uns ein Script, in dem then falsch geschrieben ist, folgende Fehlermeldung aus:

you@host > ./script1./script1: line 19: syntax error near unexpected token `fi'./script1: line 19: `fi'

Ein Syntaxfehler, der sehr häufig vorkommt, ist die Verwendung von ' anstelle ei-

nes ` bei einer Kommando-Substitution.

� Logische Fehler – Bei logischen Fehlern hat sich ein Denkfehler eingeschlichen.

Das Script wird zwar ohne eine Fehlermeldung ausgeführt, führt aber nicht zum

gewünschten Ergebnis. Ein einfaches Beispiel:

4087.book Seite 407 Freitag, 4. März 2016 1:00 13

Page 11: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

408

if [ ! -e $creatfile ]then # Nein ...

touch $creatfile # Datei anlegen ...# Jetzt nochmals überprüfen ...if [ -e $creatfile ]then

echo "Konnte $creatfile nicht anlegen"exit 1 # Script erfolglos beenden

elseecho "$creatfile erfolgreich angelegt"

fifi

Sofern die Datei $creatfile nicht existiert, gibt das Script Folgendes aus:

you@host > ./createfile2Konnte atestfile.txt nicht anlegen

Und das, obwohl die Datei angelegt wurde. Hier haben Sie es nicht – wie man häu-

fig vermutet – mit mangelnden Rechten zu tun, sondern mit einem vergessenen

Negationszeichen (!) in der zweiten if-Anweisung.

# Jetzt nochmals überprüfen ...if [ ! -e $creatfile ]

Ein einfacher Fehler, der aber häufig nicht gleich gefunden wird.

� Fehler der Shell oder der Kommandos – Dies wird wohl der seltenste Fall eines

Fehlers sein. Dabei handelt es sich um einen Fehler, der nicht Ihre Schuld ist, son-

dern die des Programmierers der Shell oder des Kommandos. Hier bleibt Ihnen

nichts anderes übrig, als den Autor des Kommandos zu kontaktieren und ihm die-

sen Fehler mitzuteilen oder auf ein anderes Kommando auszuweichen.

10.3 Fehlersuche

Wenn der Fehler aufgetreten ist, dann bietet Ihnen die Shell einige Optionen, die Ih-

nen bei der Fehlersuche helfen. Aber egal, welche Fehler denn nun aufgetreten sind,

als Erstes sollten Sie die Fehlermeldung lesen und auch verstehen können. Das ist

plausibel, aber leider werden immer wieder Fragen gestellt, warum dies oder jenes

falsch läuft, obwohl die Antwort zum Teil schon eindeutig der Fehlermeldung zu ent-

nehmen ist. Ganz klar im Vorteil sind Sie, wenn Sie das Buch durchgearbeitet und die

Scripts abgetippt und ausprobiert haben. Durch »Trial and Error« haben Sie eine

Menge Fehler produziert; Sie haben aber auch gelernt, wann welche Fehlermeldung

ausgegeben wird.

4087.book Seite 408 Freitag, 4. März 2016 1:00 13

10.3 Fehlersuche

409

10

10.3.1 Tracen mit set -x

Den Trace-Modus (trace = verfolgen, untersuchen), den man mit set -x setzt, haben Sie

schon des Öfteren in diesem Buch eingesetzt, etwa als es darum ging, zu sehen, wie

das Script bzw. die Befehle ablaufen. Die Option -x wurde bereits in Abschnitt 1.8.9

ausführlich behandelt. Trotzdem muss noch erwähnt werden, dass die Verwendung

der Trace-Option nur in der aktuellen Shell aktiv ist. Nehmen wir an, Sie wollen wis-

sen, was beim folgenden Script passiert:

# Name: areweroot

if [ $UID = 0 ]then

echo "Wir sind root!"renice –5 $$

elseecho "Wir sind nicht root!"sudo renice –5 $$

fi

Wenn Sie das Script jetzt tracen wollen, genügt es nicht, einfach vor seiner Verwen-

dung die Option -x zu setzen:

you@host > ./areweroot+ ./arewerootWir sind nicht root!Password:********8967: Alte Priorität: 0, neue Priorität: –5

Das ist ein häufiges Missverständnis. Sie müssen die Option selbstverständlich an

der entsprechenden Stelle (oder am Anfang des Scripts) setzen:

# Name: areweroot2

# Trace-Modus einschaltenset -x

if [ $UID = 0 ]then

echo "Wir sind root!"renice –5 $$

elseecho "Wir sind nicht root!"sudo renice –5 $$

fi

4087.book Seite 409 Freitag, 4. März 2016 1:00 13

Page 12: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

410

Das Script bei der Ausführung:

you@host > ./areweroot2+ ./areweroot++ '[' 1000 = 0 ']'++ echo 'Wir sind nicht root!'Wir sind nicht root!++ su -c 'renice –5 $$'Password:*******9050: Alte Priorität: 0, neue Priorität: –5you@host > suPassword:********# ./areweroot2++ '[' 0 = 0 ']'++ echo 'Wir sind root!'Wir sind root!++ renice –5 90709070: Alte Priorität: 0, neue Priorität: –5

Tracen mit Shell-Aufruf

Alternativ bietet sich hier auch die Möglichkeit, die Option -x an das Script mit einem

Shell-Aufruf zu übergeben, z. B. bash -x ./script oder ksh -x ./script, wodurch sich

eine Modifikation am Script vermeiden lässt. Oder Sie verwenden die Shebang-Zeile:

#!/usr/bin/bash -x.

Häufig finden Sie mehrere Pluszeichen am Anfang einer Zeile. Dies zeigt an, wie tief

die Verschachtelungsebene ist, in der die entsprechende Zeile ausgeführt wird. Jedes

weitere Zeichen bedeutet »eine Ebene tiefer«. So verwendet beispielsweise folgendes

Script drei Schachtelungsebenen:

# Name: datum

# Trace-Modus einschaltenset -x

datum=`date`echo "Heute ist $datum"

Das Script bei der Ausführung:

you@host > ./datum+./script1+++ date

4087.book Seite 410 Freitag, 4. März 2016 1:00 13

10.3 Fehlersuche

411

10

++ datum=Mi Mai 4 10:26:25 CEST 2016++ echo 'Heute ist Mi Mai 4 10:26:25 CEST 2016'Heute ist Mi Mai 4 10:26:25 CEST 2016

10.3.2 Das DEBUG- und das ERR-Signal

Für die Bash und die Korn-Shell gibt es eine echte Debugging-Alternative mit dem

DEBUG-Signal. Das ERR-Signal hingegen ist nur der Korn-Shell vorbehalten. Angewen-

det werden diese Signale genauso, wie Sie dies von den Signalen her kennen. Sie rich-

ten sich hierbei einen Handler mit trap ein.

trap 'Kommando(s)' DEBUG# nur für die Korn-Shelltrap 'Kommando(s)' ERR

Im folgenden Beispiel haben wir ein Script, das ständig in einer Endlosschleife läuft,

aber wir sind zu blind, den Fehler zu erkennen:

# Name: debug1

val=1

while [ "$val" -le 10 ]do

echo "Der ${val}. Schleifendurchlauf"i=`expr $val + 1`

done

Jetzt wollen wir in das Script mit trap einen »Entwanzer« einbauen:

# Name: debug1

trap 'printf "$LINENO :-> " ; read line ; eval $line' DEBUG

val=1

while [ "$val" -le 10 ]do

echo "Der ${val}. Schleifendurchlauf"i=`expr $val + 1`

done

4087.book Seite 411 Freitag, 4. März 2016 1:00 13

Page 13: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

412

Beim Entwanzen wird gewöhnlich das Kommando eval verwendet, mit dem Sie im

Script Kommandos so ausführen können, als wären diese Teil des Scripts (siehe Ab-

schnitt 9.1):

trap 'printf "$LINENO :-> " ; read line ; eval $line' DEBUG

Mit DEBUG wird nach jedem Ausdruck ein DEBUG-Signal gesendet, das Sie »trap(pen)«

können, um eine bestimmte Aktion auszuführen. Im Beispiel wird zunächst die Zei-

lennummer des Scripts, gefolgt von einem Prompt, ausgegeben. Anschließend kön-

nen Sie einen Befehl einlesen und mit eval ausführen lassen (beispielsweise Variablen

erhöhen oder reduzieren, Datei(en) anlegen, löschen, verändern, auflisten, überprü-

fen etc). Das Script bei der Ausführung:

you@host > ./debug15 :->(¢)

7 :->(¢)

9 :->(¢)

Der 1. Schleifendurchlauf10 :-> echo $val17 :->(¢)

9 :->(¢)

Der 1. Schleifendurchlauf10 :-> echo $val17 :->(¢)

9 :->(¢)

Der 1. Schleifendurchlauf10 :-> val=`expr $val + 1`7 :-> echo $val29 :->(¢)

Der 2. Schleifendurchlauf10 :->(¢)

7 :->(¢)

9 :->(¢)

Der 2. Schleifendurchlauf10 :-> exit

Der Fehler ist gefunden: Die Variable val wurde nicht hochgezählt, und ein Blick auf

die Zeile 10 zeigt Folgendes:

i=`expr $val + 1`

4087.book Seite 412 Freitag, 4. März 2016 1:00 13

10.3 Fehlersuche

413

10

Hier haben wir i statt val verwendet. Etwas störend ist allerdings, dass nur die Zeilen-

nummer ausgegeben wird. Bei längeren Scripts ist es schwer bzw. umständlich, die

Zeilennummer parallel zum Debuggen zu behandeln. Daher ist es sinnvoll, wenn

auch hier die entsprechende Zeile mit ausgegeben wird, die ausgeführt wird bzw.

wurde. Dies ist im Grunde kein Problem, da hier die DEBUG-Signale nur in der Bash

bzw. der Korn-Shell vorhanden sind, weshalb auch gleich das komplette Script in ein

Array eingelesen werden kann. Für den Index verwenden Sie einfach wieder die

Variable LINENO. Die Zeile eval zum Ausführen von Kommandos packen Sie einfach in

eine separate Funktion, die beliebig viele Befehle aufnehmen kann, bis eben (¢)

gedrückt wird.

# Name: debug2

# ------- DEBUG Anfang --------- #

# Die übliche eval-Funktiondebugging() {

printf "STOP > "while truedo

read line[ "$line" = "" ] && breakeval $lineprintf " > "

done}

typeset -i index=1

# Das komplette Script in ein Array einlesenwhile read zeile[$index]do

index=index+1done<$0

trap 'echo "${zeile[$LINENO]}" ; debugging' DEBUG

# ------- DEBUG Ende --------- #

typeset -i val=1

while (( $val <= 10 ))do

4087.book Seite 413 Freitag, 4. März 2016 1:00 13

Page 14: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

414

echo "Der $val Schleifendurchlauf"val=val+1

done

Das Script bei der Ausführung:

you@host > ./debug2typeset -i val=1STOP >(¢)

while (( $val <= 10 ))STOP > echo $val1> val=7> echo $val7>(¢)

echo "Der $val Schleifendurchlauf"STOP >(¢)

Der 7 Schleifendurchlaufval=val+1STOP >(¢)

while (( $val <= 10 ))STOP >(¢)

echo "Der $val Schleifendurchlauf"STOP >(¢)

Der 8 Schleifendurchlaufval=val+1STOP >(¢)

while (( $val <= 10 ))STOP >(¢)

echo "Der $val Schleifendurchlauf"STOP >(¢)

Der 9 Schleifendurchlaufval=val+1STOP >exityou@host >

Shells ohne DEBUG-Signal

Auch in der Bourne-Shell oder in anderen Shells, die eben nicht das DEBUG-Signal

unterstützen, können Sie die Funktion debugging() hinzufügen. Nur müssen Sie

diese Funktion mehrmals hinter oder/und vor den Zeilen einsetzen, von denen Sie

vermuten, dass das Script nicht richtig funktioniert. Natürlich sollten Sie es nicht ver-

säumen, dies aus Ihrem fertigen Script wieder zu entfernen.

4087.book Seite 414 Freitag, 4. März 2016 1:00 13

10.3 Fehlersuche

415

10

In der Korn-Shell finden Sie auch das Signal ERR, das Sie ebenfalls mit trap einfangen

können. Allerdings handelt es sich hierbei eher um ein Pseudo-Signal, denn das Sig-

nal bezieht sich immer auf den Rückgabewert eines Kommandos. Ist dieser ungleich

0, wird das Signal ERR gesendet. Allerdings lässt sich dies nicht dort verwenden, wo

bereits der Exit-Code eines Kommandos abgefragt wird (beispielsweise if, while ...).

Auch hierzu zeigen wir Ihnen ein simples Script, das das Signal ERR abfängt:

# Name: debugERR

error_handling() {echo "Fehler: $ERRNO Zeile: $LINENO"printf "Beenden (j/n) : " ; read[ "$REPLY" = "j" ] && exit 1

}

trap 'error_handling' ERR

echo "Testen des ERR-Signals"# Sollte dem normalen Benutzer untersagt seincat > /etc/profileecho "Nach dem Testen des ERR-Signals"

Das Script bei der Ausführung:

you@host > ksh ./debugERRTesten des ERR-SignalsFehler: Permission denied Zeile: 4Beenden (j/n) : j

Das Signal ERR in der Bash

Zwar wird die Bash beim Signal ERR in den Dokumentationen nicht erwähnt, aber

beim Testen hat es auch unter der Bash funktioniert, nur dass es eben in der Bash

nicht die Variable ERRNO gibt.

10.3.3 Variablen und Syntax überprüfen

Um wirklich sicherzugehen, dass Sie nicht auf eine nicht gesetzte Variable zugreifen,

können Sie set mit der Option -u verwenden. Wird hierbei auf eine nicht definierte

Variable zugegriffen, wird eine entsprechende Fehlermeldung ausgegeben. Mit +u

schalten Sie diese Option wieder ab.

4087.book Seite 415 Freitag, 4. März 2016 1:00 13

Page 15: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

10 Fehlersuche und Debugging

416

# Name: aunboundvar

# Keine undefinierten Variablen zulassenset -u

var1=100echo $var1 $var2

Das Script bei der Ausführung:

you@host > ./aunboundvar./aunboundvar: line 7: var2: unbound variable

Wollen Sie ein Script nicht ausführen, sondern nur dessen Syntax überprüfen lassen,

können Sie die Option -n verwenden. Mit +n schalten Sie diese Option wieder aus.

10.3.4 Eine Debug-Ausgabe hinzufügen

Die primitivste Form aller Debugging-Techniken ist gleichzeitig wohl die meisteinge-

setzte Variante – nicht nur in der Shell-Programmierung. Sie setzen überall dort, wo

Sie einen Fehler vermuten, eine echo-Ausgabe über den Zustand der Daten (beispiels-

weise ermitteln Sie, welchen Wert eine Variable hat). Gibt das Script sehr viel auf dem

Bildschirm aus, kann man auch einfach hier und da mal ein einfaches read einbauen,

wodurch auf einen (¢)-Tastendruck gewartet wird, ehe die Ausführung des Scripts

weiter fortfährt, oder man kann auch die eine oder andere störende Ausgabe kurzzei-

tig ins Datengrab /dev/null schicken. Ein einfaches Beispiel:

# Name: maskieren

nobody() {echo "Die Ausgabe wollen wir nicht!!!"

}

echo "Ausgabe1"exec 1>/dev/nullnobodyexec 1>`tty`echo "Ausgabe2"

Hier interessieren wir uns nicht für die Ausgabe der Funktion nobody und schicken

die Standardausgabe ins Datengrab. Natürlich müssen Sie das Ganze wieder rückgän-

gig machen. Hier erreichen wir dies mit einer Umleitung auf das aktuelle Terminal

(das Kommando tty übernimmt das für uns).

4087.book Seite 416 Freitag, 4. März 2016 1:00 13

10.3 Fehlersuche

417

10

10.3.5 Debugging-Tools

Wenn Sie ein fertiges Debugging-Tool sucht, dann seien Ihnen für die Bash der De-

bugger bashdb (http://bashdb.sourceforge.net) und für die Korn-Shell kshdb ans Herz

gelegt. Der Bash-Debugger ist nichts anderes als eine gepatchte Version der Bash, die

ein besseres Debugging ebenso wie eine verbesserte Fehlerausgabe unterstützt.

4087.book Seite 417 Freitag, 4. März 2016 1:00 13

Page 16: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

419

11

Kapitel 11

11 Reguläre Ausdrücke und grep

Die Verwendung von regulären Ausdrücken und grep zählt zum

Grundwissen eines jeden Linux/UNIX-Anwenders. Und für einen

Systemadministrator ist sie sowieso unerlässlich, denn es gibt kein

vernünftiges System, in dem reguläre Ausdrücke nicht vorkommen.

Eine kurze Einführung zu den regulären Ausdrücken wie auch zum

Tool grep (und seinen Nachkommen wie beispielsweise egrep und

fgrep) erscheint uns daher notwendig.

11.1 Reguläre Ausdrücke – die Theorie

Reguläre Ausdrücke (engl. regular expressions) sind eine leistungsfähige formale

Sprache, mit der sich eine bestimmte (Unter-)Menge von Zeichenketten beschreiben

lässt. Es muss allerdings gleich erwähnt werden, dass reguläre Ausdrücke kein Tool

und keine Sammlung von Funktionen sind, die von einem Betriebssystem abhängig

sind; sondern es handelt sich in der Tat um eine echte Sprache mit einer formalen

Grammatik, in der jeder Ausdruck eine präzise Bedeutung hat.

Reguläre Ausdrücke werden von sehr vielen Texteditoren und Programmen einge-

setzt. Meistens verwendet man sie, um bestimmte Muster zu suchen und diese dann

durch etwas anderes zu ersetzen. In der Linux/UNIX-Welt werden reguläre Aus-

drücke vorwiegend bei Programmen wie grep, sed und awk oder den Texteditoren vi

und Emacs verwendet. Aber auch viele Programmiersprachen, unter anderem Perl,

Java, Python, Tcl, PHP oder Ruby, bieten reguläre Ausdrücke an.

Die Entstehungsgeschichte der regulären Ausdrücke ist schnell erzählt. Den Grund-

stein hat ein Mathematiker und Logiker, Stephen Kleene, gelegt. Er gilt übrigens auch

als Mitbegründer der theoretischen Informatik, besonders der hier behandelten for-

malen Sprachen und der Automatentheorie. Stephen Kleene verwendete eine Nota-

tion, die er selbst reguläre Menge nannte. Später verwendete dann Ken Thompson

(der Miterfinder der Programmiersprache C) diese Notationen für eine Vorgänger-

Version des UNIX-Editors ed und für das Werkzeug grep. Nach der Fertigstellung von

grep wurden die regulären Ausdrücke in sehr vielen Programmen implementiert.

Viele davon benutzen die mittlerweile sehr bekannte Bibliothek regex von Henry

Spencer.

4087.book Seite 419 Freitag, 4. März 2016 1:00 13

Page 17: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

420

Die Grenzen von grep

Sofern Sie Erweiterungen wie Rückwärtsreferenzen verwenden wollen, sei Ihnen Perl

empfohlen, weil grep hier an die Leistungsgrenzen kommt. Inzwischen unterscheidet

man übrigens verschiedene regexes (POSIX-RE, Extended-RE und pcre). Die Unter-

schiede sind in den Manuals regex und perlre zu finden. Ein Großteil der Scriptspra-

chen und Programme stützt sich auf die Variante pcre (Perl Compatible Regular

Expressions), die mittlerweile als die leistungsfähigste gilt. Mit der Option -P können

Sie die erweiterten Features der pcre auch mit grep nutzen.

11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE)

Vorwiegend werden reguläre Ausdrücke dazu verwendet, bestimmte Zeichenketten

in einer Menge von Zeichen zu suchen und zu finden. Die nun folgende Beschrei-

bung ist eine sehr häufig verwendete Konvention, die von fast allen Programmen,

die reguläre Ausdrücke verwenden, so eingesetzt wird. Gewöhnlich wird dabei ein re-

gulärer Ausdruck aus den Zeichen des Alphabets in Kombination mit den Metazei-

chen gebildet. (Die Metazeichen werden hier gleich vorgestellt.).

Zeichenliterale

Als Zeichenliterale bezeichnet man die Zeichen, die wörtlich übereinstimmen müs-

sen. Diese werden im regulären Ausdruck direkt (als Wort) notiert. Hierbei besteht je

nach System auch die Möglichkeit, alles in hexadezimaler oder oktaler Form anzu-

geben.

Beliebiges Zeichen

Für ein einzelnes beliebiges Zeichen verwendet man einen Punkt. Dieser Punkt kann

dann für ein fast beliebiges Zeichen stehen.

Zeichenauswahl

Die Zeichenauswahl mit den eckigen Klammern [auswahl] kennen Sie ebenfalls be-

reits von der Shell, (siehe Abschnitt 1.10.6). Alles, was Sie in den eckigen Klammern

schreiben, gilt dann exakt für ein Zeichen aus dieser Auswahl. Beispielsweise steht

[axz] für eines der Zeichen »a«, »x« oder »z«. Dies lässt sich natürlich auch in Berei-

che aufteilen. So besteht bei der Angabe von [2-7] der Bereich aus den Ziffern 2 bis

7. Mit dem Zeichen ^ innerhalb der Zeichenauswahl können Sie auch Zeichen aus-

schließen. Beispielsweise schließen Sie mit [^a-f] die Zeichen »a«, »b«, »c«, »d«,

»e« oder »f« aus.

4087.book Seite 420 Freitag, 4. März 2016 1:00 13

11.1 Reguläre Ausdrücke – die Theorie

421

11

Vordefinierte Zeichenklassen

Manche Implementationen von regulären Ausdrücken bieten auch vordefinierte

Zeichenklassen an. Sofern Sie keine solch vordefinierten Zeichenklassen finden, lässt

sich dies auch selbst durch eine Zeichenauswahl in eckigen Klammern beschreiben.

Die vordefinierten Zeichenklassen sind letztendlich auch nur eine Kurzform der Zei-

chenklassen. Tabelle 11.1 führt einige bekannte vordefinierte Zeichenklassen auf.

Quantifizierer

Als Quantifizierer bzw. Quantoren bezeichnet man Elemente, die es erlauben, den

vorherigen Ausdruck in unterschiedlicher Vielfalt in einer Zeichenkette zuzulassen

(siehe Tabelle 11.2).

Vordefiniert Bedeutung Selbstdefiniert

\d Eine Zahl [0-9]

\D Keine Zahl [^0–9]

\w Ein Buchstabe, eine Zahl oder der Unterstrich [a-zA-Z_0-9]

\W Kein Buchstabe, keine Zahl und kein Unterstrich [^a-zA-Z_0-9]

\s Whitespace-Zeichen [ \f\n\r\t\v]

\S Alle Zeichen außer Whitespace-Zeichen [^\f\n\r\t\v]

Tabelle 11.1 Vordefinierte Zeichenklassen

Quantifizierer Bedeutung

? Der Ausdruck, der voransteht, ist optional, d. h., er kann einmal vor-

kommen, muss aber nicht. Der Ausdruck kommt also entweder null-

oder einmal vor.

+ Der Ausdruck muss mindestens einmal vorkommen, darf aber auch

mehrmals vorhanden sein.

* Der Ausdruck darf beliebig oft oder auch gar nicht vorkommen.

{min,} Der voranstehende Ausdruck muss mindestens min-mal vorkom-

men.

{min,max} Der voranstehende Ausdruck muss mindestens min-mal, darf aber

nicht mehr als max-mal vorkommen.

{n} Der voranstehende Ausdruck muss genau n-mal vorkommen.

Tabelle 11.2 Quantifizierer

4087.book Seite 421 Freitag, 4. März 2016 1:00 13

Page 18: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

422

Gruppierung

Ausdrücke können auch zwischen runden Klammern gruppiert werden. Einige Tools

speichern diese Gruppierung ab und ermöglichen so eine Wiederverwendung im re-

gulären Ausdruck bzw. bei der Textersetzung über \1. Es lassen sich hiermit bis zu

neun Muster abspeichern (\1, \2 ... \9). Beispielsweise würde man mit

s/\(string1\) \(string2\) \(string3\)/\3 \2 \1/g

erreichen, dass in einer Textdatei alle Vorkommen von

string1 string2 string3

umgeändert werden in:

string3 string2 string1

\1 bezieht sich also immer auf das erste Klammernpaar, \2 auf das zweite usw.

Alternativen

Selbstverständlich lassen sich auch Alternativen definieren. Hierfür wird das Zeichen

| verwendet. Beispielsweise bedeutet

(asdf|ASDF)

dass nach »asdf« oder »ASDF« gesucht wird, nicht aber nach »AsDf« oder »asdF«.

Sonderzeichen

Da viele Tools direkt auf Textdateien zugreifen, sind gewöhnlich noch die in Ta-

belle 11.3 aufgelisteten Sonderzeichen definiert.

Sonderzeichen Bedeutung

^ Steht für den Zeilenanfang.

$ Steht für das Zeilenende.

\b Steht für die leere Zeichenkette am Wortanfang oder am Wort-

ende.

\B Steht für die leere Zeichenkette, die nicht den Anfang oder das Ende

eines Wortes bildet.

\< Steht für die leere Zeichenkette am Wortanfang.

\> Steht für die leere Zeichenkette am Wortende.

\d Ziffer

Tabelle 11.3 Sonderzeichen bei regulären Ausdrücken

4087.book Seite 422 Freitag, 4. März 2016 1:00 13

11.2 grep

423

11

Jedes dieser Metazeichen lässt sich auch mit dem Backslash (\) maskieren.

11.1.2 Zusammenfassung

Grau ist alle Theorie, und trotzdem ließe sich zu den regulären Ausdrücken noch viel

mehr schreiben. Damit das hier Beschriebene für Sie kein Buch mit sieben Siegeln

bleibt, greifen wir im nächsten Abschnitt mit grep darauf zurück. Auch in den Ab-

schnitten zu sed und awk hilft Ihnen das Wissen über reguläre Ausdrücke weiter.

Mehr zu den regulären Ausdrücken finden Sie im Internet unter der Adresse http://

www.lrz.de/services/schulung/unterlagen/regul/. Wollen Sie sogar wissen, wie man

reguläre Ausdrücke selbst programmieren kann, finden Sie in »C von A bis Z« einen

kleinen Abschnitt dazu, den Sie auch online auf Jürgens Webseite unter www.elemen-

taria.org einsehen können.

11.2 grep

Um in Dateien nach bestimmten Mustern zu suchen, wird häufig grep verwendet.

grep steht für »Global search for a Regular Expression and Print out matched lines«.

Es gibt mittlerweile vier verschiedene solcher grep-Kommandos:

� grep – der Klassiker

� egrep – Kurzform für »Extended Grep«, also ein erweitertes grep, das im Gegensatz

zu grep noch mehr reguläre Ausdrücke versteht

� fgrep – Kurzform für »Fixed Grep« (oder gern auch »Faster Grep«). fgrep versteht

weniger reguläre Ausdrücke als grep und ist dadurch erheblich schneller bei der

Suche in großen Dateien als grep oder egrep.

\D Keine Ziffer

\s Whitespace

\S Kein Whitespace

. Zeichen

+ Voriger Ausdruck mindestens einmal

* Voriger Ausdruck beliebig oft

? Voriger Ausdruck null- oder einmal

Sonderzeichen Bedeutung

Tabelle 11.3 Sonderzeichen bei regulären Ausdrücken (Forts.)

4087.book Seite 423 Freitag, 4. März 2016 1:00 13

Page 19: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

424

� rgrep – Kurzform für »Rekursive Grep«. rgrep wird für die rekursive Suche in Un-

terverzeichnissen verwendet. Es muss allerdings erwähnt werden, dass rgrep die

Unterverzeichnisse auch komplett durchläuft.

11.2.1 Wie arbeitet grep?

Das grep-Kommando sucht nach einem Muster von Zeichen in einer oder mehreren

Datei(en). Enthält das Muster ein Whitespace, muss es entsprechend gequotet wer-

den. Das Muster ist also entweder eine gequotete Zeichenkette oder ein einfaches

Wort. Alle anderen Worte hinter dem Muster werden von grep dann als Datei(en) ver-

wendet, in denen nach dem Muster gesucht wird. Die Ausgabe sendet grep an die

Standardausgabe (meistens ist das der Bildschirm), und grep nimmt auch keinerlei

Änderung an der Eingabedatei vor. Die Syntax lautet:

grep wort datei1 [datei2] ... [datein]

Ein viel zitiertes Beispiel ist:

you@host > grep john /etc/passwdjohn:x:1002:100:Jonathan Wolf:/home/john:/bin/csh

grep sucht hier nach dem Muster »john« in der Datei /etc/passwd. Bei Erfolg wird die

entsprechende Zeile auf dem Bildschirm ausgegeben. Wird das Muster nicht gefun-

den, gibt es keine Ausgabe und auch keine Fehlermeldung. Existiert die Datei nicht,

wird eine Fehlermeldung auf dem Bildschirm ausgegeben.

Als Rückgabewert von grep erhalten Sie bei einer erfolgreichen Suche den Wert 0.

Wird ein Muster nicht gefunden, gibt grep 1 als Exit-Code zurück, und wird die Datei

nicht gefunden, wird 2 zurückgegeben. Der Rückgabewert von grep ist in den Shell-

scripts häufig von Bedeutung, da Sie relativ selten die Ausgaben auf dem Bildschirm

machen werden. Und vom Exit-Code hängt es häufig auch ab, wie Ihr Script weiter-

laufen soll.

grep gibt den Exit-Code 0 zurück, also wurde ein Muster gefunden:

you@host > grep you /etc/passwd > /dev/nullyou@host > echo $?0

grep gibt den Exit-Code 1 zurück, somit wurde kein übereinstimmendes Muster ge-

funden:

you@host > grep gibtsnicht /etc/passwd > /dev/nullyou@host > echo $?1

4087.book Seite 424 Freitag, 4. März 2016 1:00 13

11.2 grep

425

11

grep gibt den Exit-Code 2 zurück – die Datei scheint nicht zu existieren (oder wurde,

wie hier, falsch geschrieben):

you@host > grep you /etc/PASSwd > /dev/null 2>&1you@host > echo $?2

grep kann seine Eingabe neben Dateien auch von der Standardeingabe oder einer Pipe

erhalten:

you@host > grep echo < script1echo "Ausgabe1"echo "Ausgabe2"you@host > cat script1 | grep echoecho "Ausgabe1"echo "Ausgabe2"

Auch grep kennt eine ganze Menge regulärer Ausdrücke. Metazeichen helfen Ihnen

dabei, sich mit grep ein Suchmuster zu erstellen. Und natürlich unterstützt auch grep

viele Optionen, die Sie dem Kommando mitgeben können. Auf einige dieser Features

wird in den folgenden Abschnitten eingegangen.

11.2.2 grep mit regulären Ausdrücken

Dass grep eines der ältesten Programme ist, das reguläre Ausdrücke kennt, haben wir

bereits gesagt. Welche regulären Ausdrücke grep kennt, wird in Tabelle 11.4 aufgelis-

tet. Allerdings kennt grep nicht alle regulären Ausdrücke, weshalb es außerdem das

Kommando egrep gibt, das noch einige mehr versteht (siehe Tabelle 11.5).

Zeichen Funktion Beispiel Bedeutung

^ Anfang der Zeile '^wort' Gibt alle Zeilen aus, die mit

»wort« beginnen.

$ Ende der Zeile 'wort$' Gibt alle Zeilen aus, die mit

»wort« enden.

^$ Komplette Zeile '^wort$' Gibt alle vollständigen Zei-

len mit dem Muster »wort«

aus.

Tabelle 11.4 Reguläre Ausdrücke von »grep«

4087.book Seite 425 Freitag, 4. März 2016 1:00 13

Page 20: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

426

. Beliebiges Zeichen 'w.rt' Gibt alle Zeilen aus, die ein

»w«, einen beliebigen Buch-

staben und »rt« enthalten

(beispielsweise »wort«,

»wert«, »wirt«, »wart«).

* Beliebig oft 'wort*' Gibt alle Zeilen aus mit

beliebig vielen (oder auch

gar keinen) des vorangegan-

genen Zeichens.

.* Beliebig viele 'wort.*wort' Die Kombination .* steht

für beliebig viele Zeichen.

[] Ein Zeichen aus

dem Bereich

'[Ww]ort' Gibt alle Zeilen aus, die Zei-

chen im angegebenen

Bereich (im Beispiel nach

»Wort« oder »wort«) ent-

halten.

[^] Kein Zeichen aus

dem Bereich

'[^A-VX-Za-z]ort' Die Zeichen, die im angege-

benen Bereich stehen, wer-

den nicht beachtet. (Im

Beispiel kann »Wort« gefun-

den werden, nicht aber

»Tort« oder »Sort« und auch

nicht »wort«.)

\< Anfang eines

Wortes

'\<wort' Findet hier alles, was mit

»wort« beginnt (beispiels-

weise »wort«, »wortreich«,

aber nicht »Vorwort« oder

»Nachwort«).

\> Ende eines Wortes 'wort\>' Findet alle Zeilen, die mit

»wort« enden (beispiels-

weise »Vorwort« oder

»Nachwort«, nicht aber

»wort« oder »wortreich«).

\<\> Ein Wort '\<wort\>' Findet exakt »wort« und

nicht »Nachwort« oder

»wortreich«.

Zeichen Funktion Beispiel Bedeutung

Tabelle 11.4 Reguläre Ausdrücke von »grep« (Forts.)

4087.book Seite 426 Freitag, 4. März 2016 1:00 13

11.2 grep

427

11

Zusätzlich zu diesen regulären Ausdrücken kennt egrep noch folgende:

Hier folgen jetzt einige Beispiele zu den regulären Ausdrücken mit grep. Wir nutzen

dazu die Datei mit dem folgenden Muster:

you@host > cat mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975

\(...\) Backreferenz '\(wort\)' Merkt sich die eingeschlos-

senen Muster vor, um

darauf später über \1 zuzu-

greifen. Bis zu neun Muster

können auf diese Weise

gespeichert werden.

x\{m\} Exakte Wiederho-

lung des Zeichens

x\{3\} Exakt 3-maliges Auftreten

des Zeichens »x«.

x\{m,\} Mindestens Wie-

derholung des Zei-

chens

x\{3,\} Mindestens ein 3-maliges

Auftreten des Zeichens »x«.

x\{m,n\} Mindeste bis maxi-

male Wiederho-

lung des Zeichens

x\{3,6\} Mindestens ein 3-maliges

Auftreten des Zeichens »x«

bis maximal 6-maliges Auf-

treten (nicht mehr).

Zeichen Funktion Beispiel Bedeutung

+ Mindestens

einmal

'wort[0–9]+' Es muss mindestens eine

Ziffer aus dem Bereich vor-

kommen.

? Null- oder einmal 'wort[0–9]?' Eine Ziffer aus dem Bereich

darf, muss aber nicht vor-

kommen.

| Alternativen 'worta|wortb' Das Wort »worta« oder

»wortb«

Tabelle 11.5 Weitere reguläre Ausdrücke von »egrep«

Zeichen Funktion Beispiel Bedeutung

Tabelle 11.4 Reguläre Ausdrücke von »grep« (Forts.)

4087.book Seite 427 Freitag, 4. März 2016 1:00 13

Page 21: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

428

Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Einfachstes Beispiel:

you@host > grep Libanon mrolympia.datSamir Bannout Libanon 1983

Hierbei werden alle Zeilen ausgegeben, die den regulären Ausdruck »Libanon« in der

Datei mrolympia.dat enthalten. Nächstes Beispiel:

you@host > grep '^S' mrolympia.datSergio Oliva USA 1967 1968 1969Samir Bannout Libanon 1983

Hiermit werden alle Zeilen ausgegeben, die mit dem Zeichen »S« beginnen. Das

Caret-Zeichen (^) steht immer für den Anfang einer Zeile.

Nächstes Beispiel:

you@host > grep '1$' mrolympia.datFranco Columbu Argentinien 1976 1981Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991

Hiermit werden alle Zeilen ausgegeben, die mit dem Zeichen »1« enden. Das Dollar-

zeichen steht hierbei für das Ende einer Zeile.

Nächstes Beispiel:

you@host > grep Sergio Yates mrolympia.datgrep: Yates: Datei oder Verzeichnis nicht gefundenmrolympia.dat:Sergio Oliva USA 1967 1968 1969

Hier wurde ein Fehler gemacht, da grep das dritte Argument, den Namen »Yates«, be-

reits als eine Dateiangabe behandelt, in der nach einem Muster gesucht wird. Einen

Namen wie »Sergio Yates« gibt es nämlich nicht in dieser Datei. Damit das Muster

auch komplett zum Vergleich für grep verwendet wird, müssen Sie es zwischen Single

Quotes stellen:

you@host > grep 'Sergio Yates' mrolympia.datyou@host > echo $?1

4087.book Seite 428 Freitag, 4. März 2016 1:00 13

11.2 grep

429

11

Das nächste Beispiel:

you@host > grep '197.' mrolympia.datArnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981

Wer war in den 70er-Jahren am besten? Damit geben Sie alle Zeilen aus, in denen sich

das Muster »197« und ein weiteres beliebiges einzelnes Zeichen befindet. Sofern Sie

wirklich nach einem Punkt suchen, müssen Sie einen Backslash davor setzen. Dies

gilt übrigens für alle Metazeichen.

Nächstes Beispiel:

you@host > grep '^[AS]' mrolympia.datSergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Samir Bannout Libanon 1983

Hier wird jede Zeile ausgegeben, die mit dem Zeichen »A« und »S« beginnt.

Nächstes Beispiel:

you@host > grep '^[^AS]' mrolympia.datLarry Scott USA 1965 1966Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Jetzt werden alle Zeilen ausgegeben, die nicht ([^AS]) mit dem Zeichen »A« oder »S«

beginnen.

Nächstes Beispiel:

you@host > grep '^S.*Libanon' mrolympia.datSamir Bannout Libanon 1983

Hier liefert grep die Zeile zurück, die mit einem Zeichen »S« beginnt, gefolgt von

beliebig vielen Zeichen, und die die Zeichenfolge »Libanon« enthält.

Nächstes Beispiel:

you@host > grep '^S.*196.' mrolympia.datSergio Oliva USA 1967 1968 1969

4087.book Seite 429 Freitag, 4. März 2016 1:00 13

Page 22: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

430

Ähnlich wie im Beispiel zuvor werden die Zeilen ausgegeben, die mit dem Zeichen

»S« beginnen und die Textfolge »196« mit einem beliebigen weiteren Zeichen ent-

halten.

Nächstes Beispiel:

you@host > grep '[a-z]\{14\}' mrolympia.datArnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997

Gibt alle Zeilen aus, in denen 14 Buchstaben hintereinander Kleinbuchstaben sind.

Nächstes Beispiel:

you@host > grep '\<Col' mrolympia.datFranco Columbu Argentinien 1976 1981Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Hier werden alle Zeilen ausgegeben, in denen sich ein Wort befindet, das mit »Col«

beginnt.

Nächstes Beispiel:

you@host > grep 'A\>' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Das Gegenteil vom Beispiel zuvor: Hier werden alle Zeilen ausgegeben, in denen sich

ein Wort befindet, das mit »A« endet.

Nächstes Beispiel:

you@host > grep '\<Coleman\>' mrolympia.datRonnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Hierbei wird nach einem vollständigen Wort »Coleman« gesucht, also nicht nach

»AColeman« und auch nicht nach »Colemann«.

Nächstes Beispiel:

you@host > grep '\<.*ien.*\>' mrolympia.datFranco Columbu Argentinien 1976 1981Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997

Hier werden alle Zeilen ausgegeben, die ein Wort mit der Zeichenfolge »ien« enthal-

ten. Davor und danach können sich beliebig viele Zeichen befinden.

4087.book Seite 430 Freitag, 4. März 2016 1:00 13

11.2 grep

431

11

Nächstes Beispiel:

you@host > grep '\<[G].*ien\>' mrolympia.datDorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997

Hier wird nach einem Wort gesucht, das mit dem Großbuchstaben »G« beginnt und

mit der Zeichenfolge »ien« endet. Dazwischen können sich beliebig viele Zeichen be-

finden.

Natürlich können Sie grep auch dazu verwenden, in einem ganzen Verzeichnis die

Dateien nach einem bestimmten Muster abzusuchen. Hier können Sie wieder das

Metazeichen * als Platzhalter für alle Dateien im Verzeichnis verwenden:

you@host > grep 'echo' *...

Hier werden im aktuellen Arbeitsverzeichnis alle Dateien nach dem Muster »echo«

durchsucht.

11.2.3 grep mit Pipes

Häufig wird grep in Verbindung mit einer Pipe verwendet. Hierbei übergeben Sie

grep dann statt einer Datei als drittes Argument für die Eingabe die Daten durch eine

Pipe von der Standardausgabe eines anderen Kommandos. Beispielsweise bekom-

men Sie mit

you@host > ps -ef | grep $USER

alle Prozesse aufgelistet, deren Eigentümer der aktuelle User ist bzw. die dieser ge-

startet hat. Dabei gibt ps seine Ausgabe durch die Pipe an die Standardeingabe von

grep. grep wiederum sucht dann in der entsprechenden Ausgabe nach dem entspre-

chenden Muster und gibt gegebenenfalls die Zeile(n) aus, die mit dem Muster über-

einstimmen. Natürlich können Sie hierbei auch, wie schon gehabt, die regulären Aus-

drücke verwenden. Die Syntax lautet:

kommando | grep muster

Ebenfalls relativ häufig wird grep mit ls zur Suche bestimmter Dateien verwendet:

you@host > ls | grep '^scr.*'script1script1~script2script2~

4087.book Seite 431 Freitag, 4. März 2016 1:00 13

Page 23: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

432

Im Abschnitt zuvor haben Sie mit

you@host > grep 'echo' *

alle Dateien nach dem Muster »echo« durchsucht. Meistens – uns ging es zumindest

so – haben Sie neben einfachen Scripts auch noch eine Menge Dokumentationen im

Verzeichnis herumliegen. Wollen Sie jetzt auch noch die Dateinamen mithilfe regu-

lärer Ausdrücke eingrenzen, können Sie die Ausgabe von grep an die Eingabe eines

weiteren grep-Aufrufs hängen:

you@host > grep 'echo' * | grep 'scrip.*'...

Jetzt wird in allen Dateien des aktuellen Verzeichnisses nach dem Muster »echo«

gesucht (erstes grep), und anschließend (zweites grep) werden nur die Dateien be-

rücksichtigt, die mit der Zeichenfolge »scrip« beginnen, gefolgt von beliebig vielen

weiteren Zeichen.

11.2.4 grep mit Optionen

Natürlich bietet grep Ihnen neben den regulären Ausdrücken auch noch eine Menge

weiterer Optionen an, mit denen Sie das Verhalten, insbesondere der Standardaus-

gabe steuern können. Im folgenden Abschnitt finden Sie eine Liste mit den inte-

ressantesten und gängigsten Optionen (was bedeutet, dass dies längst nicht alle

sind). Reichen Ihnen diese Optionen nicht aus, müssen Sie in den Manualpages blät-

tern. Als Beispiel dient wieder unsere Datei mrolympia.dat:

you@host > cat mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

� -n – Damit wird die Zeile zurückgegeben, in der das Suchmuster gefunden wurde,

und zwar mit zusätzlich n Zeilen vor und nach dieser Zeile. In der Praxis:

you@host > grep –1 Sergio mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975

4087.book Seite 432 Freitag, 4. März 2016 1:00 13

11.2 grep

433

11

Hierbei wurde vor und nach der gefundenen Zeile jeweils eine zusätzliche Zeile

ausgegeben. Dies ist in der Praxis bei einem etwas längeren Text mit mehreren

Abschnitten sehr sinnvoll, da man häufig mit einem ausgegebenen Teilsatz aus

der Zeile 343 nicht viel anfangen kann.

� -A anzahl – ähnlich wie -n, nur dass noch zusätzlich anzahl Zeilen mit ausgegeben

werden, die nach der Zeile enthalten sind.

� -B anzahl – wie -A anzahl, nur dass anzahl Zeilen ausgegeben werden, die vor der

Zeile enthalten sind, in der der reguläre Ausdruck abgedeckt wurde.

� -c (für count) – Damit wird nur die Anzahl von Zeilen ausgegeben, die durch den

regulären Ausdruck abgedeckt werden:

you@host > grep -c '.*' mrolympia.dat9you@host > grep -c 'USA' mrolympia.dat5

Hier wurden zum Beispiel die Daten aller Sportler ausgegeben und beim nächsten

Ausdruck nur noch die Teilnehmer aus den USA. 5 von den 9 ehemaligen Titelträ-

gern kamen also aus den USA.

� -h – Bei dieser Option wird der Dateiname, in dem der Suchstring gefunden wurde,

nicht vor den Zeilen mit ausgegeben:

you@host > grep 'Ausgabe1' *script1:echo "Ausgabe1"script1~:echo "Ausgabe1"you@host > grep -h 'Ausgabe1' *echo "Ausgabe1"echo "Ausgabe1"

� -i – Es wird nicht zwischen Groß- und Kleinschreibung unterschieden. Ein Bei-

spiel:

you@host > grep 'uSa' mrolympia.datyou@host > grep -i 'uSa' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

� -l – Bei dieser Option werden nur die Dateinamen aufgelistet, in denen eine Zeile

mit dem entsprechenden Suchmuster gefunden wurde:

you@host > grep -l echo *Kap 1 bis 9.docksh.2010-02-02.linux.i386

4087.book Seite 433 Freitag, 4. März 2016 1:00 13

Page 24: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

434

script1script1~script2script2~

� -n – Hiermit wird vor jeder gefundenen Zeile in der Datei die laufende Zeilennum-

mer mit ausgegeben, beispielsweise so:

you@host > grep -n echo *script1:4: echo "Die Ausgabe wollen wir nicht!!!"script1:7:echo "Ausgabe1"script1:11:echo "Ausgabe2"...script2:9: echo "Starte script1 ..."script2~:7: echo "Warte ein wenig ..."script2~:9: echo "Starte script1 ..."

� -q – Bei Verwendung dieser Option erfolgt keine Ausgabe, sondern es wird 0 zu-

rückgegeben, wenn ein Suchtext gefunden wurde, oder 1, wenn die Suche erfolg-

los war. Diese Option wird gewöhnlich in Shellscripts verwendet, bei denen man

sich meistens nur dafür interessiert, ob eine Datei einen Suchtext enthält oder

nicht.

� -s – Mit dieser Option werden keine Fehlermeldungen ausgegeben, wenn eine Da-

tei nicht existiert.

you@host > grep test /etc/gibtsnichtgrep: /etc/gibtsnicht: Datei oder Verzeichnis nicht gefundenyou@host > grep -s test /etc/gibtsnichtyou@host >

� -v – Damit werden alle Zeilen ausgegeben, die nicht durch den angegebenen regu-

lären Ausdruck abgedeckt werden:

you@host > grep -v 'USA' mrolympia.datArnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Samir Bannout Libanon 1983Dorian Yates Grossbritannien 1992 1993 1994 1995 1996 1997

� -w – ist eine Abkürzung für \<wort\>. Damit wird nach ganzen Wörtern im Such-

text gesucht:

you@host > grep 'Lib' mrolympia.datSamir Bannout Libanon 1983you@host > grep -w 'Lib' mrolympia.datyou@host >

4087.book Seite 434 Freitag, 4. März 2016 1:00 13

11.2 grep

435

11

11.2.5 egrep (extended grep)

Wie Sie bereits erfahren haben, lassen sich mit egrep erweiterte und weitaus komple-

xere reguläre Ausdrücke bilden. Allerdings wird Otto Normalverbraucher (wie auch

die meisten Systemadministratoren) mit grep mehr als zufrieden sein. Komplexere

reguläre Ausdrücke gehen natürlich enorm auf Kosten der Ausführgeschwindigkeit.

Übrigens können Sie einen egrep-Aufruf auch mit grep und der Option -E realisieren:

grep -E regex Datei

Einige Beispiele mit egrep:

you@host > egrep 'Colombo|Columbu' mrolympia.datFranco Columbu Argentinien 1976 1981you@host > egrep 'Colombo|Columbu|Col' mrolympia.datFranco Columbu Argentinien 1976 1981Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Wissen Sie nicht genau, wie man einen bestimmten Namen schreibt, können Sie mit

| mehrere Suchmuster miteinander verknüpfen. Im Beispiel wird nach »Colombo«

oder »Columbu« und im zweiten Beispiel noch zusätzlich nach einer Zeichenfolge

»Col« gesucht. Kennen Sie mehrere Personen mit dem Namen »Olivia« und wollen

Sie nach einem »Sergio Olivia« und einem »Gregor Olivia« suchen, können Sie das

Ganze folgendermaßen definieren:

egrep '(Sergio|Gregor) Olivia' mrolympia.dat

Nächstes Beispiel:

you@host > egrep 'y+' mrolympia.datLarry Scott USA 1965 1966Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991

Mit dem + wird nach mindestens einem »y«-Zeichen gesucht. Wollen Sie beispiels-

weise alle Zeilen einer Datei ausgeben, die mit mindestens einem oder mehreren

Leerzeichen beginnen, können Sie dies folgendermaßen definieren:

you@host > egrep '^ +' mrolympia.dat

Nächstes Beispiel:

you@host > egrep 'US?' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

4087.book Seite 435 Freitag, 4. März 2016 1:00 13

Page 25: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

11 Reguläre Ausdrücke und grep

436

Wenn Sie jetzt nicht wissen, ob die Zeichenfolge für die USA »USA« oder »US« lautet,

können Sie das Fragezeichen verwenden. Damit legen Sie fest, dass hier ein Zeichen

vorkommen darf, aber nicht vorkommen muss. Somit wird sowohl die Zeichenfolge

»US« als auch die Zeichenfolge »USA« gefunden.

11.2.6 fgrep (fixed oder fast grep)

fgrep wird vorwiegend für »schnelle greps« verwendet (fgrep = fast grep). Allerdings

ist nur eine Suche nach einfachen Zeichenketten möglich. Reguläre Ausdrücke gibt

es hierbei nicht – ein Vorteil, wenn Sie nach Zeichenfolgen suchen, die Metazeichen

enthalten.

11.2.7 rgrep

Weil grep nur im aktuellen Verzeichnis sucht, wurde rgrep entwickelt. rgrep sucht

mit einer rekursiven Suche in Unterverzeichnissen nach entsprechenden Mustern.

Bei einer großen Verzeichnistiefe kann dies allerdings problematisch werden. Wenn

Sie beispielsweise nur das aktuelle Verzeichnis und die direkten Unterverzeichnisse

durchsuchen wollen, so würde auch ein grep wie

grep regex */*

ausreichen. Mehr zu rgrep entnehmen Sie bitte der Manualpage.

11.3 Aufgaben

1. Mit welchem Kommando können Sie sich anzeigen lassen, welche Benutzer in der

Datei /etc/passwd die bash als Standard-Shell eingetragen haben?

2. Sie haben eine Datei, bei der es viele Leerzeilen zwischen dem Text gibt und an

manchen Stellen auch mehr als ein Leerzeichen zwischen den Wörtern. Wie kön-

nen Sie diese Datei so formatieren, dass alle Leerzeilen und alle doppelten Leerzei-

chen aus ihr entfernt werden?

3. Suchen Sie in der Datei mrolympia.dat nach allen Zeilen, in denen die Jahreszahlen

1990 bis 1999 vorkommen.

4. Lassen Sie sich von Ihrer ersten Netzwerkkarte nur die IP-Adresse aus der Informa-

tion von ifconfig eth0 anzeigen.

4087.book Seite 436 Freitag, 4. März 2016 1:00 13

Page 26: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

437

12

Kapitel 12

12 Der Stream-Editor sed

sed ist ein relativ altes Tool, wird aber immer noch vielfach eingesetzt,

etwa um Zeilen einer Datei oder eines Datenstroms zu manipulieren.

Besonders häufig und gern wird sed zum Suchen und Ersetzen von Zei-

chenfolgen verwendet.

12.1 Funktions- und Anwendungsweise von sed

Bevor Sie sich mit dem Editor sed auseinandersetzen, möchten wir Ihnen zunächst

die grundlegende Funktionsweise des sed-Kommandos beschreiben. sed wurde be-

reits in den 70er-Jahren von Lee E. McMahon in den Bell Labs entwickelt. Der Name

»sed« steht für Stream EDitor. Natürlich ist sed kein Editor in dem Sinne, wie Sie es

vielleicht von vim oder Emacs her kennen.

12.1.1 Grundlegende Funktionsweise

Mittlerweile hat jede Linux- bzw. UNIX-Distribution eine eigene sed-Version. Linux

verwendet gewöhnlich GNU-sed, was eine erweiterte Variante des Ur-sed ist. Bei-

spielsweise bietet GNU-sed sogeanntes In-place-Editing, womit eine Änderung direkt

im Eingabefilter möglich ist. Solaris wiederum bietet gleich drei Versionen von sed

an: eine von AT&T-abgeleitete, eine von BSD UNIX und eine weitere, die dem XPG4-

Standard entspricht (natürlich kann unter Solaris und BSD auch GNU-sed verwendet

werden). Generell unterscheiden sich die einzelnen Versionen in der Funktionsviel-

falt, was hier allerdings kein Problem sein sollte, da vorwiegend auf die grundlegen-

den Funktionen von sed eingegangen wird, die jedes sed kennen sollte.

sed bekommt seine Kommandos entweder aus einer Datei oder von der Kommando-

zeile. Meistens handelt es sich aber um eine Datei. Diese Datei (bzw. das Kommando

aus der Kommandozeile) liest sed Zeile für Zeile von der Standardeingabe ein, kopiert

diese in einen extra dafür angelegten Puffer (in den sogenannten Patternspace), bear-

beitet diesen Puffer nach einer von Ihnen bestimmten Regel und gibt den veränder-

ten Puffer anschließend wieder auf die Standardausgabe aus. Bei dem Puffer handelt

es sich um eine Kopie einer jeden Zeile, das heißt, jegliche Kommandoausführung

von sed bezieht sich von nun an auf diesen Puffer. Die Quelldatei bleibt hierbei im-

mer unverändert. Es sollte hier klar geworden sein, dass sed zeilenweise arbeitet –

4087.book Seite 437 Freitag, 4. März 2016 1:00 13

Page 27: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

438

eine Zeile wird eingelesen, bearbeitet und wieder ausgegeben. Natürlich findet dieser

ganze Arbeitsvorgang in einer Schleife statt (siehe Abbildung 12.1).

Abbildung 12.1 Die Arbeitsweise von »sed«

Die Quelldatei bleibt unverändert

Dass die Quelldatei unverändert bleibt, sorgt immer wieder für Verwirrung. Aber

eigentlich ist dies logisch, denn es ist nun mal nicht möglich, gleichzeitig aus einer

Datei zu lesen und in sie hineinzuschreiben. Man muss also die Ausgabe in einer

temporären Datei speichern, sie zurückkopieren und die temporäre Datei wieder

löschen.

Neben dem Puffer Patternspace gibt es noch einen zweiten Puffer, den Holdspace.

Diesen können Sie mit speziellen Kommandos verwenden, um Daten untereinander

(zwischen dem Pattern- und dem Holdspace) auszutauschen. Die Puffergröße (oder

auch die Zeichen, die pro Zeile aufgenommen werden können) ist bei moderneren

sed-Versionen unbegrenzt. Bei älteren Versionen gibt es häufig noch eine Begren-

zung auf 8192 Zeichen.

Die Syntax zu sed lautet:

sed [-option] Kommando [Datei] ... [Datei_n]sed -f Kommandodatei [Datei] ... [Datei_n]

Damit die Kommandos nicht mit der fleißigen Shell und deren Mühen, Metazeichen

vorher zu interpretieren, kollidieren, sollten Sie die sed-Kommandos zwischen Single

Quotes setzen:

sed [-option] 'Kommando' [Datei] ... [Datei_n]

Eingabe

Dateistdin

ZeilenweisesEinlesen

Patternspace

Holdspace

Kommando-Ausführung

Ausgabe

stdout

4087.book Seite 438 Freitag, 4. März 2016 1:00 13

12.1 Funktions- und Anwendungsweise von sed

439

12

Natürlich können Sie auch mehrere Kommandos auf einmal verwenden. Hierzu

müssen Sie entweder die einzelnen Kommandos mit einem Semikolon voneinander

trennen oder Sie schreiben in jeder Zeile ein Kommando:

sed 'Kommando1 ; Kommando2 ; Kommando3' Datei

sed 'Kommando1> Kommando2> Kommando3' Datei

Hier sehen Sie als Beispiel drei verschiedene sed-Kommandos, die alle drei zum sel-

ben Ziel führen:

you@host > sed -n '/Scott/p' mrolympia.datLarry Scott USA 1965 1966you@host > sed -n '/Scott/p' < mrolympia.datLarry Scott USA 1965 1966you@host > cat mrolympia.dat | sed -n '/Scott/p'Larry Scott USA 1965 1966

sed liest immer von der Standardeingabe und schreibt standardmäßig auf die Stan-

dardausgabe. Mit dem letzten Parameter können Sie einen oder auch mehrere Datei-

namen angeben, von denen sed aus dem Eingabestrom lesen soll. Wie Sie im Beispiel

sehen konnten, können Sie sich hier auch der Umlenkungszeichen (<, >, |) bedienen.

Die nähere Bedeutung der sed-Befehle, die im Beispiel oben verwendet wurden, wer-

den Sie in den folgenden Abschnitten kennenlernen.

12.1.2 Wohin mit der Ausgabe?

Wenn Sie den sed-Editor verwenden, werden Sie wohl im seltensten Fall eine Ausgabe

auf dem Bildschirm machen wollen. Es gibt drei gängige Anwendungsmöglichkeiten,

die Ausgabe von sed in die richtigen Bahnen zu lenken.

In diesem Abschnitt behandeln wir erst einmal die gängigsten Methoden von sed,

ohne bereits auf die einzelnen Optionen bzw. Features von sed einzugehen.

Hinweis

Die Ausgabe von sed erfolgt auf den Standardausgabekanal, Fehlermeldungen erfol-

gen auf den Standardfehlerkanal. Der Rückgabewert von sed ist dabei ungleich

(meistens größer als) 0.

4087.book Seite 439 Freitag, 4. März 2016 1:00 13

Page 28: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

440

Mehrere Dateien bearbeiten

Wenn Sie mehrere Dateien auf einmal mit sed bearbeiten wollen bzw. müssen, kann

es sinnvoll sein, anstatt eines Kommandos eine Kommandodatei zu verwenden – Sie

dürfen hierzu gern auch sed-Script sagen. Der Vorteil: Diese Kommandodatei kön-

nen Sie jederzeit wieder verwenden. Anstatt also eine Datei wie folgt mit sed zu bear-

beiten:

sed -n 'kommando ; kommando; kommando' Datei > Zieldatei

können Sie ein sed-Script verwenden:

sed -f ased_script.sed Datei > Zieldatei

Damit können Sie de facto mehrere Dateien komfortabel mit einem sed-Script bear-

beiten. Theoretisch könnten Sie hierbei vorgefertigte sed-Scripts einsetzen, ohne dass

Sie überhaupt Kenntnisse von sed haben müssen (was allerdings nicht sehr empfeh-

lenswert ist). Wie Sie eigene sed-Scripts schreiben, erfahren Sie in Abschnitt 12.5. Ge-

wöhnlich werden Sie das sed-Script auf mehrere Dateien auf einmal in einem Shell-

script ansetzen. Dies können Sie dann beispielsweise folgendermaßen machen:

# Alle Dateien im aktuellen Verzeichnisfor file in *do

sed -f ased_script.sed $file > temp# Achtung, hier wird das Original verändert!mv tmp $file

done

Direkt aus einem Kommando bearbeiten

Im Beispiel oben wurden mehrere Dateien neu bearbeitet. Wenn Sie ein wenig vor-

ausschauender arbeiten, könnten Sie diesen Schritt auch auslassen, indem Sie gleich

von vornherein darauf achten, dass man die Datei gar nicht bearbeiten muss (natür-

lich ist dies nicht immer möglich). Dies lässt sich wieder mit einer Pipe realisieren:

kommando | sed -f ased_script.sed > Dateikommando | sed -n 'kommando' > Dateishellscript | sed -f ased_script.sed > Dateishellscript | sed -f 'Kommando' > Datei

Hierbei schreibt ein Prozess (ein Kommando oder auch ein Shellscript) seine Daten

in die Standardausgabe durch die Pipe. Auf der anderen Seite der Pipe wartet sed mit

der Standardeingabe auf diese Daten und verarbeitet sie zeilenweise mit dem sed-

Script. Die Ausgabe wird mit einer Umlenkung in eine Datei geschrieben.

4087.book Seite 440 Freitag, 4. März 2016 1:00 13

12.3 Adressen

441

12

Direkt aus einer Datei bearbeiten

Selbstverständlich können Sie mit sed auch einen Text aus einer Datei extrahieren,

zerlegen und in eine neue Zieldatei speichern, ohne die Originaldatei zu verändern:

sed -n '/ein_wort/p' Datei > Zieldatei

Damit extrahiert sed alle Zeilen mit dem Wort »ein_wort« aus Datei und schreibt die-

se Zeilen in die Zieldatei.

12.2 Der sed-Befehl

Ein sed-Befehl sieht auf den ersten Blick etwas undurchsichtig aus, ist aber einfacher,

als man vermuten würde. Hier ist ein solcher typischer sed-Befehl im Rohformat:

sed '[adresse1[,adresse2]]kommando' [datei(en)]

Alle Argumente, bis auf kommando, sind erst mal optional. Jeder sed-Aufruf benötigt

also mindestens einen Kommandoaufruf. Die Operation kommando bezieht sich auf

einen bestimmten Bereich bzw. eine bestimmte Adresse einer Datei (solche Adressen

werden im nächsten Abschnitt behandelt). Den Bereich können Sie mit adresse1 be-

stimmen. Geben Sie hierbei noch adresse2 an, so erstreckt sich der Bereich von der

Zeile adresse1 bis zur Zeile adresse2. Sie können diesen Bereich auch negieren, indem

Sie hinter adresse1 und adresse2 ein !-Zeichen setzen. Dann bezieht sich kommando nur

auf den Bereich, der nicht von adresse1 bis adresse2 abgedeckt wird. Ein einfaches

Beispiel:

you@host > sed -n 'p' file.dat

Hiermit geben Sie praktisch die komplette Datei file.dat auf dem Bildschirm aus. Das

Kommando p steht für print, also für die Ausgabe (auf den Bildschirm). Damit sed die

Zeile(n) nicht doppelt ausgibt, wurde die Option -n verwendet. Näheres dazu folgt

später.

12.3 Adressen

Adressen sind, wie eben erwähnt, entweder fixe Zeilen, ganze Bereiche oder aber Zei-

len, die auf einen bestimmten regulären Ausdruck passen. Hier sehen Sie einige

Beispiele dafür, wie Sie bestimmte Adressen definieren und welche Zeilen Sie damit

selektieren. Zur Demonstration wird immer die Option -n verwendet, mit der Sie den

Default-Output von sed abschalten, sowie das Kommando p, mit dem Sie die selek-

tierte(n) Zeile(n) auf dem Bildschirm ausgeben lassen können.

4087.book Seite 441 Freitag, 4. März 2016 1:00 13

Page 29: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

442

Nur die vierte Zeile der Datei file.dat selektieren und ausgeben:

you@host > sed -n '4p' file.dat

Die Zeilen 4, 5, 6 und 7 aus der Datei file.dat selektieren und ausgeben. Geben Sie für

die »bis«-Adresse einen niedrigeren Wert an als für die »von«-Adresse, so wird dieser

Wert ignoriert:

you@host > sed -n '4,7p' file.dat

Hiermit werden alle Zeilen von Zeile 4 bis zum Ende der Datei ausgegeben – das Dol-

larzeichen steht für die letzte Zeile:

you@host > sed -n '4,$p' file.dat

Damit werden alle Zeilen selektiert und ausgegeben, in denen sich das Wort »wort«

befindet:

you@host > sed -n '/wort/p' file.dat

Hier werden alle Zeilen ausgegeben, die die Zeichenfolge »197« und eine beliebige

Zahl von 0 bis 9 enthalten (1970, 1971 … 1979):

you@host > sed -n '/197[0–9]/p' file.dat

Neben den Möglichkeiten mit

[Adresse1, Adresse2]Kommando

und

[Adresse]Kommando

gibt es auch noch eine dritte Möglichkeit, wie Sie Adressen angeben können. Man

kann nämlich durch die Verwendung von geschweiften Klammern mehrere Kom-

mandos zusammenfassen:

Adresse{Kommando1Kommando2

}

Oder auch als Einzeiler:

Adresse{ Kommando1 ; Kommando2 ; ... }

Beispiel:

you@host > sed -n '1{p ; s/USA/ASU/g ; p }' mrolympia.datLarry Scott USA 1965 1966Larry Scott ASU 1965 1966

4087.book Seite 442 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

443

12

Hiermit bearbeiten Sie die erste Zeile der Datei mrolympia.dat. Zuerst geben Sie diese

Zeile aus, anschließend führen Sie mit s/.../.../g eine globale (g) Ersetzung mittels

s (substitute) der Zeichenfolge »USA« durch »ASU« durch und geben daraufhin diese

Zeile (ggf. verändert) nochmals aus. Natürlich können Sie eine solche Ersetzung auch

ohne Angabe einer Adresse auf die ganze Datei machen:

you@host > sed -n '{/USA/p ; s/USA/ASU/g ; /ASU/p; }' mrolympia.dat

Da hierbei keine direkte Adressierung verwendet wird, können Sie das Ganze auch

gleich ohne geschweifte Klammern machen:

you@host > sed -n '/USA/p ; s/USA/ASU/g ; /ASU/p' mrolympia.dat

Natürlich können Sie auch mit den geschweiften Klammern einen Adressbereich

verwenden:

you@host > sed -n '1,5{/USA/p ; s/USA/ASU/g ; /ASU/p; }' \> mrolympia.dat

Hierbei wurden die Zeilen 1 bis 5 zusammengefasst, um alle Kommandos in den ge-

schweiften Klammern darauf auszuführen.

12.4 Kommandos, Substitutionsflags und Optionen von sed

In den obigen Beispielen haben Sie bisher immer die Option -n und das Kommando

p verwendet. sed bietet neben p eine interessante Fülle von Kommandos an. Bevor Sie

die einzelnen Kommandos und Optionen in der Praxis einsetzen, sollten Sie sich Ta-

belle 12.1 bis Tabelle 12.3 ansehen, die die Optionen, die Kommandos und die soge-

nannten Substitutionsflags zusammenfassen.

Tabelle 12.1 listet die wichtigsten Kommandos von sed auf.

Kommando Bedeutung

a (für append) Fügt eine oder mehrere Zeilen an die selektierte Zeile an.

c (für change) Ersetzt die selektierte Zeile durch eine oder mehrere neue.

d (für delete) Löscht Zeile(n).

g (für get »buffer«) Kopiert den Inhalt des temporären Puffers (Hold-

space) in den Arbeitspuffer (Patternspace).

G (für GetNewline) Fügt den Inhalt des temporären Puffers (Holdspace)

an den Arbeitspuffer (Patternspace) an.

Tabelle 12.1 Gängige Basiskommandos von »sed«

4087.book Seite 443 Freitag, 4. März 2016 1:00 13

Page 30: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

444

Bei Verwendung einer Substitution mittels s/.../.../ können zusätzliche Flags

(Substitutionsflags) angegeben werden, die am Ende des Befehls notiert werden. Bei-

spielsweise findet mit s/.../.../g eine globale Ersetzung statt. Das heißt, es werden

alle Vorkommen eines Musters in einer Zeile ersetzt. Ohne g würde nur das erste Vor-

kommen ersetzt. Tabelle 12.2 enthält einige dieser Flags und deren Bedeutung.

h (für hold »buffer«) Gegenstück zu g. Kopiert den Inhalt des Arbeitspuf-

fers (Patternspace) in den temporären Puffer (Holdspace).

H (für HoldNewline) Gegenstück zu G. Fügt den Inhalt des Arbeitspuffers

(Patternspace) an den temporären Puffer (Holdspace) an.

i (für insert) Fügt eine neue Zeile vor der selektierten Zeile ein.

l (für listing) Zeigt nicht druckbare Zeichen an.

n (für next) Wendet das nächste Kommando statt des aktuellen auf die

nächste Zeile an.

p (für print) Gibt die Zeilen aus.

q (für quit) Beendet sed.

r (für read) Datei integrieren; liest Zeilen aus einer Datei ein.

s (für substitute) Ersetzt eine Zeichenfolge durch eine andere.

x (für Xchange) Vertauschen des temporären Puffers (Holdspace) mit

dem Arbeitspuffer (Patternspace)

y (für yank) Zeichen aus einer Liste ersetzen; Ersetzen eines Zeichens

durch ein anderes

w (für write) Schreibt Zeilen in eine Datei.

! Negation; wendet die Kommandos auf Zeilen an, die nicht zutreffen.

Flag Bedeutung

g Globale Ersetzung (aller Vorkommen eines Musters in der Zeile)

p Ausgabe der Zeile

w Tauscht den Inhalt des Zwischenspeichers gegen die aktuell selek-

tierte Zeile aus.

Tabelle 12.2 Einige Substitutionsflags

Kommando Bedeutung

Tabelle 12.1 Gängige Basiskommandos von »sed« (Forts.)

4087.book Seite 444 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

445

12

Tabelle 12.3 enthält die Schalter-Optionen, die Sie mit sed verwenden können.

Noch mehr Optionen

Die meisten sed-Versionen (GNU-sed, BSD-sed, FreeBSD-sed und ssed) bieten neben

diesen Optionen noch einige weitere an, deren Bedeutung Sie bei Bedarf der Manual-

page von sed entnehmen können.

Wie grep versteht auch sed eine Menge regulärer Ausdrücke. Auch hier bieten die

unterschiedlichen sed-Versionen die eine oder andere Erweiterung an. Allerdings

begnügen wir uns hier wieder mit den grundlegenden Ausdrücken. Die regulären

Ausdrücke, die sed versteht, finden Sie in Tabelle 12.4 aufgelistet.

Option Bedeutung

-n Schaltet »Default Output« aus. Mit dem Default Output ist die Aus-

gabe des Puffers (Patternspace) gemeint.

-e Mehrere Befehle nacheinander ausführen. Man gibt praktisch ein

Script bzw. die Kommandos direkt in der Kommandozeile ein.

-f Die sed-Befehle in einem Script (sed-Script) zusammenfassen und die-

ses Script mittels -f übergeben. Praktisch wie die Option -e, nur dass

hier anstatt des Scripts bzw. Kommandos in der Kommandozeile der

Name eines Scriptfiles angegeben wird.

Tabelle 12.3 Gängige Schalter-Optionen für »sed«

Ausdruck Bedeutung Beispiel Erklärung

^ Anfang einer Zeile /^wort/ Behandelt alle Zeilen, die

mit der Zeichenfolge wort

beginnen.

$ Ende einer Zeile /wort$/ Behandelt alle Zeilen, die mit

der Zeichenfolge wort enden.

* Keine, eine oder

mehrere Wieder-

holungen des vor-

hergehenden

Zeichens (oder

Gruppe)

/*wort/ Behandelt alle Zeilen, in

denen vor wort kein, ein oder

mehrere Zeichen stehen.

Tabelle 12.4 Grundlegende reguläre Ausdrücke, die »sed« versteht

4087.book Seite 445 Freitag, 4. März 2016 1:00 13

Page 31: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

446

. Ein Zeichen /w.rt/ Behandelt alle Zeilen mit den

Zeichenfolgen wort, wert,

wirt, wart etc. (Ausname ist

das Newline-Zeichen.)

[] Ein Zeichen aus

der Menge

/[Ww]ort/ Behandelt alle Zeilen mit der

Zeichenfolge wort oder Wort.

[^] Kein Zeichen aus

der Menge

/[^Ww]ort/ Behandelt alle Zeilen, die

nicht die Zeichenfolge wort

oder Wort enthalten.

\(...\) Speichern eines

enthaltenen

Musters

S/\(wort\)a/\1b/ Die Zeichenfolge wort wird in

\1 gespeichert. Diese Refe-

renz auf das Muster wort

verwenden Sie nun, um in

der Zeichenfolge worta das

Wort wortb zu ersetzen.

Damit lassen sich bis zu 9

solcher Referenzen definie-

ren, worauf Sie mit \1, ... \9

zugreifen können.

& Enthält das Such-

muster.

S/wort/Ant&en/ Das Ampersand-Zeichen

repräsentiert den Suchstring.

Im Beispiel wird jeder Such-

string wort durch das Wort

Antworten ersetzt.

\< Wortanfang /\<wort/ Findet alle Zeilen mit einem

Wort, das mit wort beginnt,

also wortreich, wortarm,

nicht aber Vorwort oder

Nachwort.

\> Wortende /wort\>/ Findet alle Zeilen mit einem

Wort, das mit wort endet,

also Vorwort, Nachwort, nicht

aber wortreich oder wortarm.

x\{m\}x\{m,\}x\{m,n\}

m-fache Wiederholung des Zeichens xmindestens m-fache Wiederholung des Zeichens xmindestens m-, maximal n-fache Wiederholung des Zeichens x

Ausdruck Bedeutung Beispiel Erklärung

Tabelle 12.4 Grundlegende reguläre Ausdrücke, die »sed« versteht (Forts.)

4087.book Seite 446 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

447

12

Nachdem Sie bisher eine Menge Theorie und viele Tabellen gesehen haben, folgt nun

ein Praxisteil zu der Verwendung der einzelnen Kommandos von sed. Als Beispiel

verwenden wir wieder die Datei mrolympia.dat:

you@host > cat mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Des Weiteren muss erwähnt werden, dass alle Beispiele auf dem Patternspace-Puffer

ausgeführt werden. Somit bezieht sich die Änderung nur auf die Ausgabe auf dem

Bildschirm (Standardausgabe). Sofern Sie hier gern eine bleibende Änderung vorneh-

men wollen (was in der Regel der Fall sein sollte), können Sie sich auf Abschnitt 12.1.2

beziehen. Die einfachste Lösung dürfte hier wohl die Verwendung des Umlenkungs-

zeichens am Ende des sed-Befehls sein.

12.4.1 Das a-Kommando – Zeile(n) anfügen

Die Syntax lautet:

a\neue Zeile# oder in neueren sed-Versionen aucha neue Zeile

Mit dem a-Kommando (append) können Sie eine neue Zeile hinter einer gefundenen

Zeile einfügen, beispielsweise so:

you@host > sed '/2004/ a Jay Cutler 2005' mrolympia.dat...Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004Jay Cutler 2005

Sollte die Zeile länger werden, können Sie der Übersichtlichkeit zuliebe einen Back-

slash verwenden:

4087.book Seite 447 Freitag, 4. März 2016 1:00 13

Page 32: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

448

you@host > sed '/2004/ a\> Prognose für 2005: J.Cutler; R.Coleman; M.Rühl' mrolympia.dat...Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004Prognose für 2005: J.Cutler; R.Coleman; M.Rühl'

Das Kommando »a« bei älteren sed-Versionen

Dass das Kommando a und die neue Zeile in derselben Zeile stehen, ist eine Erweite-

rung neuerer sed-Versionen. Ältere sed-Programme kennen häufig nur das a-Kom-

mando, gefolgt von einem Backslash, und die neue Zeile folgt dann in der nächsten

Zeile. Dies sollten Sie wissen, falls Sie auf einem etwas betagteren Rechner mit sedarbeiten müssen.

Beachten Sie außerdem, dass jedes Whitespace nach dem a-Kommando hinter dem

Backslash ebenfalls als ein Zeichen interpretiert und verwendet wird.

12.4.2 Das c-Kommando – Zeilen ersetzen

Die Syntax lautet:

c\neuer Text# oder in neueren sed-Versionenc neuer Text

Wollen Sie eine gefundene Zeile komplett durch eine neue Zeile ersetzen, können Sie

das c-Kommando (change) verwenden. Die Funktionsweise entspricht der des a-

Kommandos.

you@host > sed '/\<Oliva\>/ c \> Sergio Oliva Cuba 1967 1968 1969' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva Cuba 1967 1968 1969...

Im Beispiel wurden alle Zeilen mit dem Vorkommen des Wortes »Oliva« durch die in

der darauf folgenden Zeile vorgenommene Eingabe ersetzt. Hier wurde etwa die Na-

tionalität verändert. Dem c-Kommando müssen wie beim a-Kommando ein Back-

slash und ein Newline-Zeichen folgen – obgleich auch hier die neueren sed-Versionen

ohne Backslash und Newline-Zeichen auskommen.

4087.book Seite 448 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

449

12

12.4.3 Das d-Kommando – Zeilen löschen

Zum Löschen von Zeilen wird das d-Kommando (delete) verwendet. Damit wird die

entsprechende Adresse im Puffer gelöscht. Im Folgenden sehen Sie ein paar Beispiele.

� Löscht die fünfte Zeile:

you@host > sed '5d' mrolympia.dat

� Löscht ab der fünften bis zur neunten Zeile:

you@host > sed '5,9d' mrolympia.dat

� Löscht alle Zeilen ab der fünften Zeile bis zum Ende der Datei:

you@host > sed '5,$d' mrolympia.dat

� Löscht alle Zeilen, die das Muster »USA« enthalten:

you@host > sed '/USA/d' mrolympia.dat

� Löscht alle Zeilen, die nicht das Muster »USA« enthalten:

you@host > sed '/!USA/d' mrolympia.dat

12.4.4 Die Kommandos h, H, g, G und x – Arbeiten mit den Puffern

Mit den Kommandos g (get), G (GetNewline), h (hold), H (HoldNewline) und x (Xchange)

können Sie mit den Puffern (Patternspace und Holdspace) arbeiten.

Mit dem Kommando h können Sie den aktuellen Inhalt des Zwischenpuffers (Pat-

ternspace) in einen anderen Puffer (Holdspace) sichern. Mit H hängen Sie ein New-

line-Zeichen an das Ende des Puffers, gefolgt vom Inhalt des Zwischenpuffers.

Mit g, dem Gegenstück zu h, ersetzen Sie die aktuelle Zeile des Zwischenpuffers durch

den Inhalt des Puffers, den Sie zuvor mit h gesichert haben. Mit G hängen Sie ein New-

line-Zeichen an das Ende des Zwischenpuffers, gefolgt vom Inhalt des Puffers.

Mit dem Kommando x hingegen tauschen Sie den Inhalt des Zwischenpuffers gegen

den Inhalt des anderen Puffers aus.

Ein Beispiel:

you@host > sed -e '/Sergio/{h;d}' -e '$G' mrolympia.dat

Hierbei führen Sie zunächst eine Suche nach dem Muster »Sergio« in der Datei mr-

olympia.dat durch. Wird eine entsprechende Zeile gefunden, legen Sie diese in den

Holdspace zum Zwischenspeichern (Kommando h). Im nächsten Schritt löschen Sie

diese Zeile (Kommando d). Anschließend führen Sie (Option -e) das nächste Kom-

mando aus. Hier hängen Sie praktisch die Zeile im Holdspace (G) mit einem begin-

nenden Newline-Zeichen an das Ende des Patternspace. Diese Zeile wird an das Ende

angehängt ($-Zeichen). Wollen Sie diese Zeile beispielsweise in die fünfte Zeile plat-

zieren, gehen Sie wie folgt vor:

4087.book Seite 449 Freitag, 4. März 2016 1:00 13

Page 33: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

450

you@host > sed -e '/Sergio/{h;d}' -e '5G' mrolympia.datLarry Scott USA 1965 1966Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Sergio Oliva USA 1967 1968 1969Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Bitte beachten Sie, dass hierbei die gelöschte Zeile beim Einfügen mitberechnet wird.

Was passiert nun, wenn Sie die Zeile im Holdspace ohne Newline-Zeichen, wie dies

mit g der Fall ist, im Patternspace einfügen? Es geschieht Folgendes:

you@host > sed -e '/Sergio/{h;d}' -e '5g' mrolympia.datLarry Scott USA 1965 1966Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Sergio Oliva USA 1967 1968 1969Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Hier wird praktisch gnadenlos eine Zeile (hier »Chris Dickerson«) überschrieben.

Beachten Sie dies bitte bei der Verwendung von g und G bzw. h und H.

Noch ein Beispiel zum Kommando x:

you@host > sed -e '/Sergio/{h;d}' -e '/Dorian/x' \> -e '$G' mrolympia.datLarry Scott USA 1965 1966Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Sergio Oliva USA 1967 1968 1969Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004Jay Cutler 2005Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997

Hier suchen Sie zunächst nach dem Muster »Sergio«, legen dies in den Holdspace

(Kommando h) und löschen daraufhin die Zeile im Patternspace (Kommando d). Jetzt

4087.book Seite 450 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

451

12

suchen Sie nach dem Muster »Dorian« und tauschen den Inhalt des Patternspace

(Zeile mit »Dorian«) gegen den Inhalt des Holdspace (Zeile »Sergio«) aus. Jetzt befin-

det sich im Holdspace die Zeile mit »Dorian«. Diese hängen Sie mit einem weiteren

Befehl (Option -e) an das Ende des Patternspace.

12.4.5 Das Kommando i – Einfügen von Zeilen

Die Syntax:

i\text zum Einfügen# oder bei neueren sed-Versioneni text zum Einfügen

Bei diesem Kommando gilt all das, was schon zum Kommando a gesagt wurde. Damit

können Sie eine neue Zeile vor der gefundenen Zeile einfügen.

you@host > sed '/Franco/ i \> ---Zeile---' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975---Zeile---

Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982...

12.4.6 Das p-Kommando – Patternspace ausgeben

Dieses Kommando wurde schon zur Genüge verwendet. Mit p geben Sie den Pattern-

space aus. Wollen Sie beispielsweise einfach eine komplette Datei ausgeben lassen,

können Sie folgendermaßen vorgehen:

you@host > sed -n 'p' mrolympia.dat

Die Option -n ist hierbei nötig, da sonst neben dem Patternspace-Puffer auch noch

der Default Output mit ausgegeben würde und Sie somit eine doppelte Ausgabe hät-

ten. Mit -n schalten Sie den Default Output aus. Dies wird gern vergessen und führt

zu Fehlern. Wollen Sie beispielsweise die letzte Zeile in einer Datei ausgeben lassen

und vergessen dabei, den Default Output abzuschalten, bekommen Sie folgende Aus-

gabe zurück:

4087.book Seite 451 Freitag, 4. März 2016 1:00 13

Page 34: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

452

you@host > sed '$p' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Hier wird trotzdem die komplette Datei ausgegeben, da der Default Output weiterhin

über den Bildschirm rauscht. Die letzte Zeile hingegen ist doppelt vorhanden, weil

hier zum einen der Default Output seine Arbeit gemacht hat und zum anderen das p-

Kommando auch noch einmal die letzte Zeile mit ausgibt. Richtig wäre hier also:

you@host > sed -n '$p' mrolympia.datRonnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Im Folgenden sehen Sie noch einige typische Beispiele mit dem p-Kommando:

you@host > sed -n '4p' mrolympia.datFranco Columbu Argentinien 1976 1981

Hier wurde die vierte Zeile ausgegeben.

you@host > sed -n '4,6p' mrolympia.datFranco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983

Hiermit werden die Zeilen 4 bis 6 ausgegeben.

you@host > sed -n '/USA/p' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Hierbei werden alle Zeilen mit der Textfolge »USA« ausgegeben.

4087.book Seite 452 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

453

12

12.4.7 Das Kommando q – Beenden

Mit dem Kommando q können Sie das laufende sed-Script durch eine Verzweigung

zum Scriptende beenden. Vorher wird aber noch der Patternspace ausgegeben. Ein

einfaches Beispiel:

you@host > sed -n '/USA/{p;q}' mrolympia.datLarry Scott USA 1965 1966

Hier wird der sed-Befehl nach dem ersten gefundenen Muster »USA« beendet. Zuvor

wird noch der Inhalt des Patternspace ausgegeben.

12.4.8 Die Kommandos r und w

Mit dem Kommando r können Sie einen Text aus einer Datei einschieben. In den sel-

tensten Fällen werden Sie einen Text in nur einer Datei einfügen wollen. Hierzu sei

folgende einfache Textdatei gegeben:

you@host > cat header.txt---------------------------------Vorname Name Nationalität Jahr(e)---------------------------------

Der Inhalt dieser Datei soll jetzt mit dem Kommando r in die letzte Zeile eingefügt

werden:

you@host > sed '$r header.txt' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975...Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004Jay Cutler 2005---------------------------------Vorname Name Nationalität Jahr(e)---------------------------------

Natürlich können Sie auch die Zeilennummer oder ein Muster als Adresse für das

Einfügen verwenden:

you@host > sed -e '/Arnold/r header.txt' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975

4087.book Seite 453 Freitag, 4. März 2016 1:00 13

Page 35: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

454

---------------------------------Vorname Name Nationalität Jahr(e)---------------------------------Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983...

Ebenso können Sie auch mehr als nur eine Datei mithilfe der -e-Option aus einer Da-

tei einlesen lassen und in die entsprechenden Zeilen einfügen:

you@host > sed -e '3r file1.dat' -e '7r file2.dat' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975----------Ich bin file1------------Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991----------Ich bin file2------------Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

Das entsprechende Gegenstück zum Kommando r erhalten Sie mit dem Kommando

w, mit dem Sie das Ergebnis von sed in einer Datei speichern können:

you@host > sed -n '/USA/w USA.dat' mrolympia.datyou@host > cat USA.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004

12.4.9 Das Kommando s – substitute

Bei dem s-Kommando handelt es sich wohl um das meistverwendete Kommando in

sed, und es ist auch einer der Hauptgründe, sed überhaupt zu verwenden. Die Syntax

lautet:

sed -e 's/altes_Muster/neues_Muster/flag' dateised -e 's?altes_Muster?neues_Muster?flag' datei

4087.book Seite 454 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

455

12

Damit können Sie das Muster »altes_Muster« (im Patternspace) von datei durch

»neues_Muster« ersetzen. Als Trennzeichen (hier einmal mit / und ?) können Sie

praktisch jedes beliebige Zeichen verwenden (außer den Backslash und das Newline-

Zeichen), es darf nur nicht Bestandteil des Musters sein.

In der Grundform, ohne Angabe von flag, ersetzt das Kommando s nur das erste Vor-

kommen eines Musters pro Zeile. Somit können Sie mit der Angabe von flag auch

das Verhalten von s verändern. Am häufigsten verwendet wird wohl das Flag g, mit

dem alle Vorkommen eines Musters in einer Zeile nacheinander ersetzt werden –

also eine globale Ersetzung. Mit dem Flag p wird nach der letzten Ersetzung der Pat-

ternspace ausgegeben, und mit dem Flag w können Sie den Patternspace in die ange-

gebene Datei schreiben. Allerdings muss diese Option die letzte im Flag sein, da der

Dateiname bis zum Ende der Zeile geht.

Selbstverständlich werden gerade zu diesem Kommando jetzt massenhaft Beispiele

folgen:

you@host > sed 's/USA/Amerika/g' mrolympia.datLarry Scott Amerika 1965 1966Sergio Oliva Amerika 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson Amerika 1982Samir Bannout Libanon 1983Lee Haney Amerika 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman Amerika 1998 1999 2000 2001 2002 2003 2004

Hier wurden global alle Zeichenfolgen »USA« durch »Amerika« ersetzt. Natürlich

können Sie hierbei auch einzelne Zeilen mithilfe einer Adresse verändern:

you@host > sed '/Oliva/ s/USA/Cuba/' mrolympia.datLarry Scott USA 1965 1966Sergio Oliva Cuba 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981...

Hier wurde nur die Zeile ersetzt (»USA« durch »Cuba«), in der sich die Textfolge »Oli-

via« befindet. Wollen Sie nicht, dass hier die komplette Datei ausgegeben wird, son-

dern nur die Zeile(n), die ersetzt wurde(n), müssen Sie das Flag p (mit der Option -n)

verwenden:

you@host > sed -n '/Oliva/ s/USA/Cuba/p' mrolympia.datSergio Oliva Cuba 1967 1968 1969

4087.book Seite 455 Freitag, 4. März 2016 1:00 13

Page 36: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

456

Das nächste Beispiel sieht so aus:

you@host > sed 's/[12][90]/-/' mrolympia.datLarry Scott USA –65 1966Sergio Oliva USA –67 1968 1969Arnold Schwarzenegger Österreich –70 1971 1972 1973 1974 1975 1980Franco Columbu Argentinien –76 1981Chris Dickerson USA –82Samir Bannout Libanon –83Lee Haney USA –84 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien –92 1993 1994 1995 1996 1997Ronnie Coleman USA –98 1999 2000 2001 2002 2003 2004

Hier konnten Sie zum ersten Mal den Einfluss des g-Flags erkennen. Es sollten wohl

alle Zeichenfolgen »19« und »20« durch ein Minuszeichen ersetzt werden. Dasselbe

nochmals mit dem Flag g:

you@host > sed 's/[12][90]/-/g' mrolympia.datLarry Scott USA –65 –66Sergio Oliva USA –67 –68 –69Arnold Schwarzenegger Österreich –70 –71 –72 –73 –74 –75 –80Franco Columbu Argentinien –76 –81Chris Dickerson USA –82Samir Bannout Libanon –83Lee Haney USA –84 –85 –86 –87 –88 –89 –90 –91Dorian Yates Großbritannien –92 –93 –94 –95 –96 –97Ronnie Coleman USA –98 –99 –00 –01 –02 –03 –04

Hier werden auch die Zeichenfolgen »10«, »20« und »29« beachtet. Wollen Sie statt

einer Ersetzung eine Ergänzung machen, können Sie das Ampersand-Zeichen (&)

beim Ersetzungsstring verwenden:

you@host > sed -n 's/Franco Columbu/Dr. &/p' mrolympia.datDr. Franco Columbu Argentinien 1976 1981

Hier wurde der Suchstring »Franco Columbu« exakt an der Position des Ampersand-

Zeichens beim Ersetzungsstring verwendet und ein Titel davor gesetzt. Sofern Sie et-

was Derartiges global durchführen müssen und nur die ersetzten Pattern ausgeben

wollen, können Sie auch die Flags g und p gleichzeitig verwenden:

you@host > sed -n 's/USA/& (Amerika)/gp' mrolympia.datLarry Scott USA (Amerika) 1965 1966Sergio Oliva USA (Amerika) 1967 1968 1969

4087.book Seite 456 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

457

12

Chris Dickerson USA (Amerika) 1982Lee Haney USA (Amerika) 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA (Amerika) 1998 1999 2000 2001 2002 2003 2004

Mit der Option -e können Sie auch mehrere Ersetzungen auf einmal durchführen

lassen:

you@host > sed -e 's/USA/& (Amerika)/g' \> -e 's/[12][90]/-/g' mrolympia.datLarry Scott USA (Amerika) –65 –66Sergio Oliva USA (Amerika) –67 –68 –69Arnold Schwarzenegger Österreich –70 –71 –72 –73 –74 –75 –80Franco Columbu Argentinien –76 –81Chris Dickerson USA (Amerika) –82Samir Bannout Libanon –83Lee Haney USA (Amerika) –84 –85 –86 –87 –88 –89 –90 –91Dorian Yates Großbritannien –92 –93 –94 –95 –96 –97Ronnie Coleman USA (Amerika) –98 –99 –00 –01 –02 –03 –04

Gleiches können Sie übrigens auch mit einer Referenz wie folgt machen:

you@host > sed -n 's/\(USA\)/\1 (Amerika)/gp' mrolympia.datLarry Scott USA (Amerika) 1965 1966Sergio Oliva USA (Amerika) 1967 1968 1969Chris Dickerson USA (Amerika) 1982Lee Haney USA (Amerika) 1984 1985 1986 1987 1988 1989 1990 1991Ronnie Coleman USA (Amerika) 1998 1999 2000 2001 2002 2003 2004

Hier wird \1 als Referenz auf »USA« beim Ersetzungsstring verwendet.

Betrachten Sie mal folgendes Beispiel:

you@host > sed -n 's/\([12][90]\)\(..\)/\/\1\2\//gp' \> mrolympia.dat

Beim Anblick dieser Zeile fällt es schon schwer, den Überblick zu behalten. Hier sollen

alle Jahreszahlen zwischen zwei Schrägstriche gesetzt werden (/2000/, /2001/ etc).

Bei der Verwendung solcher Zeichen-Orgien empfiehlt es sich, häufiger mal ein ande-

res Trennzeichen zu verwenden:

you@host > sed -n 's#\([12][90]\)\(..\)#\/\1\2\/#gp' \> mrolympia.dat

Jetzt kann man wenigstens leichter zwischen dem Such- und dem Ersetzungsstring

unterscheiden.

4087.book Seite 457 Freitag, 4. März 2016 1:00 13

Page 37: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

458

Man könnte noch extremere Auswüchse zum Suchen und Ersetzen mit sed schrei-

ben, doch erscheint es uns an dieser Stelle wichtiger, ein Problem mit den regulären

Ausdrücken zu erwähnen, das Jürgen zur Weißglut gebracht hat, als er einen Artikel

zur Verwendung von sed in Verbindung mit HTML-Seiten schrieb. Erst ein Artikel im

Internet, den Thomas Pircher verfasste, hat dann für klare Verhältnisse gesorgt. Das

Problem: Ein regulärer Ausdruck sucht sich immer den längsten passenden String.

Nehmen wir als Beispiel diese Textfolge in einem HTML-Dokument:

Dies ist eine <strong>verflixte</strong> Stelle in einem <strong>verflixten</strong> HTML-Dokument.

Jürgen wollte alle HTML-Tags aus dem Dokument entfernen, um so eine normale

Textdatei daraus zu machen. Mit folgendem Konstrukt wollte er dies realisieren:

sed -e 's/<.*>//g' index.html

Das Ergebnis sah so aus:

Das ist ein HTML-Dokument.

Leider hatte Jürgen vergessen, dass .* so gefräßig ist (eigentlich war es ihm aus Perl

bekannt), dass es die längste Zeichenfolge sucht, also alles von

<strong>verflixte</strong> Stelle in einem <strong>verflixten</strong>

haben will. Um aber nur die Zeichen bis zum ersten Auftreten des Zeichens > zu lö-

schen, muss man mit folgender Bereichsangabe arbeiten:

sed -e 's/<[^>]*>//g' index.html

Hieran können Sie erkennen, dass die Verwendung regulärer Ausdrücke recht kom-

pliziert werden kann und dass man häufig um eine intensivere Beschäftigung mit

ihnen nicht herumkommt. Gerade, wenn Sie reguläre Ausdrücke beim Suchen und

Ersetzen mehrerer Dateien verwenden, sollten Sie wissen, was Sie tun, und gegebe-

nenfalls einen Probelauf vornehmen bzw. ein Backup zur Hand haben. Zum Glück –

und vielleicht auch deswegen – wurde sed so konzipiert, dass die Manipulation erst

mal nicht an der Originaldatei vorgenommen wird.

Manch einer mag jetzt fragen, wie man Dateien vom DOS-Format ins UNIX-Format

und umgekehrt konvertieren kann. Mit sed ist dies leichter, als Sie denken. Gehen wir

davon aus, dass eine DOS-Zeile mit CR und LF endet. Wir haben dieses Beispiel der

sed-FAQ von Eric Pement entnommen:

# 3. Under UNIX: convert DOS newlines (CR/LF) to Unix formatsed 's/.$//' file # assumes that all lines end with CR/LFsed 's/^M$// file # in bash/tcsh, press Ctrl-V then Ctrl-M

4087.book Seite 458 Freitag, 4. März 2016 1:00 13

12.4 Kommandos, Substitutionsflags und Optionen von sed

459

12

Allerdings stellt sich die Frage, ob Sie hierbei nicht lieber auf die Tools dos2unix bzw.

unix2dos zurückgreifen. Beim vim können Sie auch mittels set (set fileformat=dos

oder set fileformat=unix) das Dateiformat angeben.

Konvertierung von DOS-Zeilen in UNIX-Zeilen

Vielleicht fragen Sie sich, warum in diesem Beispiel zur Konvertierung von DOS-Zei-

len in UNIX-Zeilen nicht folgendes Konstrukt verwendet wurde:

's/\r\n/\n/g'

Die Antwort ist: Weil es so nicht überall (beispielsweise bei Debian) zu funktionieren

scheint.

12.4.10 Das Kommando y

Ein weiteres Kommando, das neben dem Kommando s gern verwendet wird, ist y

(yank), mit dem Sie eine Ersetzung von Zeichen aus einer Liste vornehmen können.

Die Syntax lautet:

y/Quellzeichen/Zielzeichen/

Hiermit werden alle Zeichen in »Quellzeichen« in die entsprechenden Zeichen in

»Zielzeichen« umgewandelt. Ist eine der Listen leer oder unterschiedlich lang, wird

sed mit einem Fehler beendet. Natürlich können Sie auch (wie schon beim Komman-

do s) als Trenner ein anderes Zeichen als / verwenden. Beispielsweise können Sie mit

folgendem sed-Befehl eine Datei nach der »rot-13«-Methode verschlüsseln (hier nur

auf die Kleinbuchstaben beschränkt):

you@host > cp mrolympia.dat mrolympia.bakyou@host > sed –e \> 'y/abcdefghijklmnopqrstuvwxyz/nopqrstuvwxyzabcdefghijklm/' \> mrolympia.bak > mrolympia.datyou@host > cat mrolympia.datLneel Spbgg USA 1965 1966Sretvb Oyvin USA 1967 1968 1969Aeabyq Spujnemrarttre Öfgrervpu 1970 1971 1972 1973 1974 1975Fenapb Cbyhzoh Aetragvavra 1976 1981...

Hiermit werden alle (Klein-)Buchstaben um 13 Zeichen verschoben. Aus »a« wird da-

durch »n«, aus »b« wird »o«, aus »c« wird »p« usw. Wollen Sie das Ganze wieder rück-

gängig machen, brauchen Sie »Quellzeichen« und »Zielzeichen« aus dem Beispiel

nur auszutauschen:

4087.book Seite 459 Freitag, 4. März 2016 1:00 13

Page 38: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

460

you@host > cp mrolympia.dat mrolympia.bakyou@host > sed –e \> 'y/nopqrstuvwxyzabcdefghijklm/abcdefghijklmnopqrstuvwxyz/' \> mrolympia.bak > mrolympia.datyou@host > cat mrolympia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981...

12.5 sed-Scripts

Neben der Methode, den sed-Befehl in den Shellscripts wie einen üblichen Befehl

oder sed in der Kommandozeile zu verwenden, haben Sie noch eine dritte Möglich-

keit, nämlich echte sed-Scripts zu schreiben. Der Vorteil ist, dass Sie so immer wieder

verwendete sed-Kommandos gleich zur Hand haben und vor allem bei etwas länge-

ren sed-Kommandos den Überblick behalten. Das sed-Script können Sie natürlich

trotzdem in einem Shellscript verwenden, nur benötigen Sie dann neben dem Shell-

script auch noch das sed-Script.

Damit sed weiß, dass es sein Kommando aus einer Datei erhält, müssen Sie die Op-

tion -f (file) verwenden. Die Syntax lautet:

sed -f sed_script.sed Datei

Folgendes müssen Sie beim Verwenden von sed-Scripts beachten:

� Mehrere Kommandos in einer Zeile müssen durch ein Semikolon getrennt werden.

� Es dürfen keine Leerzeichen, Tabulatoren etc. vor und nach den Kommandos

stehen.

� Eine Zeile, die mit # beginnt, wird als Kommentar behandelt.

Hier sehen Sie ein einfaches sed-Script, mit dem Sie eine Textdatei in eine HTML-

Datei einbetten können:

# Name: text2html.sed

# Sonderzeichen '<', '>' und '&' ins HTML-Formats/&/\&amp;/gs/</\&lt;/gs/>/\&gt;/g

# Zeile 1 selektieren wir mit insert für den HTML-Header

4087.book Seite 460 Freitag, 4. März 2016 1:00 13

12.5 sed-Scripts

461

12

1 i\<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\<html>\<head>\<title>\Converted with txt2html.sed\</title>\</head>\<body>\<pre>

# Hier kommt der Text der Datei hin

# Mit append hängen wir den Footer ans Ende$ a\</pre>\</body>\</html>

Dieses Script können Sie nun wie folgt anwenden:

you@host > sed -f text2html.sed mrolympia.dat > mrolympia.htmlyou@host > cat mrolympia.html<head><title>Converted with txt2html.sed</title></head><body><pre>Larry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Franco Columbu Argentinien 1976 1981Chris Dickerson USA 1982Samir Bannout Libanon 1983Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991Dorian Yates Großbritannien 1992 1993 1994 1995 1996 1997Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004</pre></body></html>

4087.book Seite 461 Freitag, 4. März 2016 1:00 13

Page 39: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

12 Der Stream-Editor sed

462

Dieses HTML-Dokument können Sie sich nun mit einem beliebigen Webbrowser Ih-

rer Wahl ansehen. In einem Shellscript mit vielen Dateien auf einmal können Sie das

Ganze wie folgt realisieren:

# Alle Dateien aus der Kommandozeile; alternativ könnte hier auch# das Metazeichen * verwendet werden, sodass alle Dateien aus dem# aktuellen Verzeichnis bearbeitet werdenfor file in "$@"do

sed -f txt2html.sed $file > temp# Achtung, hier wird das Original verändert!mv tmp $file

done

Die Eingabe überschreibt die Ausgabe

An dieser Stelle müssen wir nochmals darauf hinweisen, dass eine Umleitung wie

sed -f script datei > datei deshalb nicht funktioniert, weil die Eingabe die Ausgabe

überschreiben würde.

Jetzt haben Sie noch eine weitere Möglichkeit, sed zu verwenden, und zwar als eigen-

ständiges Programm. Hierzu müssen Sie nur die Ausführrechte entsprechend setzen

und in der ersten Zeile Folgendes eingeben:

#!/usr/bin/sed -f

Jetzt können Sie (im Beispiel verwenden wir nochmals das text2html-Script) das sed-

Script wie ein gewöhnliches Shellscript ausführen:

you@host > chmod u+x text2html.sedyou@host > ./text2html.sed mrolympia.dat > mrolympia.html

Sammlungen von sed-Scripts

Eine interessante Sammlung von sed-Scripts (auch von weiteren Dokumentationen,

Links etc.) finden Sie unter http://sed.sourceforge.net/grabbag/.

Sprungziele mit sed verwenden

sed unterstützt übrigens auch Sprungziele (label) – einen unbedingten Sprung (es

wird also immer gesprungen). Diesen Hinweis wollten wir geben, falls Sie sich noch

intensiver mit den sed-Scripts auseinandersetzen wollen.

4087.book Seite 462 Freitag, 4. März 2016 1:00 13

12.6 Aufgaben

463

12

12.6 Aufgaben

1. Ermitteln Sie mithilfe von who und sed die Anmeldenamen aller momentan ange-

meldeten Benutzer.

2. Erstellen Sie mithilfe von sed eine Liste aller Einträge mit den Berechtigungen in

Ihrem Heimatverzeichnis. Es sollen nur die Rechte und der Dateiname angezeigt

werden.

3. Lassen Sie sich mithilfe von sed die PID des sshd anzeigen.

4. Erstellen Sie ein sed-Kommando, mit dem Sie sich alle Kommentare aus einem

Shellscript anzeigen lassen können. Denken Sie daran, dass Kommentare sowohl

in einer ganze Zeile stehen können als auch nur am Zeilenende nach dem Shell-

Befehl.

4087.book Seite 463 Freitag, 4. März 2016 1:00 13

Page 40: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Auf einen Blick

Auf einen Blick

1 Einführung ........................................................................................................... 29

2 Variablen .............................................................................................................. 99

3 Parameter und Argumente ............................................................................ 161

4 Kontrollstrukturen ............................................................................................ 181

5 Terminal-Ein- und -Ausgabe .......................................................................... 251

6 Funktionen ........................................................................................................... 313

7 Signale ................................................................................................................... 339

8 Rund um die Ausführung von Scripts und Prozessen ........................... 357

9 Nützliche Funktionen ....................................................................................... 391

10 Fehlersuche und Debugging .......................................................................... 403

11 Reguläre Ausdrücke und grep ....................................................................... 419

12 Der Stream-Editor sed ...................................................................................... 437

13 awk-Programmierung ...................................................................................... 465

14 Linux/UNIX-Kommandoreferenz ................................................................. 525

15 Die Praxis .............................................................................................................. 627

16 GUIs und Grafiken ............................................................................................. 715

4087.book Seite 3 Freitag, 4. März 2016 1:00 13

Page 41: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

5

Inhalt

Vorwort .................................................................................................................................................. 23

Vorwort des Gutachters – die Shell: Fluch oder Segen? ........................................................ 27

1 Einführung 29

1.1 Was sollten Sie als Leser wissen? ................................................................................. 29

1.1.1 Zielgruppe ............................................................................................................... 30

1.1.2 Notation .................................................................................................................. 31

1.2 Was ist eine Shell? .............................................................................................................. 32

1.3 Hauptanwendungsgebiet ............................................................................................... 35

1.3.1 Was ist ein Shellscript? ...................................................................................... 35

1.3.2 Vergleich mit anderen Sprachen .................................................................... 36

1.4 Kommando, Programm oder Shellscript? ................................................................ 38

1.4.1 Shell-eigene Kommandos (Builtin-Kommandos) ...................................... 38

1.4.2 Aliase in der Shell ................................................................................................. 38

1.4.3 Funktionen in der Shell ...................................................................................... 39

1.4.4 Shellscripts (Shell-Prozeduren) ........................................................................ 39

1.4.5 Programme (binär) .............................................................................................. 39

1.5 Die Shell-Vielfalt .................................................................................................................. 40

1.5.1 ksh (Korn-Shell) ..................................................................................................... 40

1.5.2 Bash (Bourne-Again-Shell) ................................................................................ 41

1.5.3 zsh (Z-Shell) ............................................................................................................ 41

1.5.4 ash (A-Shell) ........................................................................................................... 41

1.5.5 rbash, rzsh (Restricted Shell) ............................................................................ 41

1.5.6 tcsh (TC-Shell) ........................................................................................................ 42

1.5.7 Welche Shell-Variante wird in diesem Buch verwendet? ...................... 42

1.5.8 rsh und ssh ............................................................................................................. 44

1.6 Betriebssysteme .................................................................................................................. 44

1.7 Crashkurs: einfacher Umgang mit der Kommandozeile ................................... 45

1.7.1 Grundlegende Befehle ....................................................................................... 45

1.7.2 Der Umgang mit Dateien .................................................................................. 47

1.7.3 Der Umgang mit Verzeichnissen .................................................................... 51

1.7.4 Datei- und Verzeichnisnamen ......................................................................... 55

4087.book Seite 5 Freitag, 4. März 2016 1:00 13

Page 42: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

6

1.7.5 Gerätenamen ........................................................................................................ 56

1.7.6 Dateiattribute ....................................................................................................... 56

1.8 Shellscripts schreiben und ausführen ........................................................................ 59

1.8.1 Der Editor ................................................................................................................ 59

1.8.2 Der Name des Shellscripts ................................................................................ 60

1.8.3 Ausführen ............................................................................................................... 61

1.8.4 Hintergrundprozess starten ............................................................................. 64

1.8.5 Ausführende Shell festlegen ............................................................................ 64

1.8.6 Kommentare .......................................................................................................... 67

1.8.7 Stil ............................................................................................................................. 68

1.8.8 Ein Shellscript beenden ...................................................................................... 69

1.8.9 Testen und Debuggen von Shellscripts ........................................................ 71

1.8.10 Ein Shellscript, das ein Shellscript erstellt und ausführt ........................ 72

1.9 Vom Shellscript zum Prozess ......................................................................................... 74

1.9.1 Ist das Shellscript ein Prozess? ........................................................................ 75

1.9.2 Echte Login-Shell? ................................................................................................ 76

1.10 Datenstrom ............................................................................................................................ 77

1.10.1 Ausgabe umleiten ................................................................................................ 78

1.10.2 Standardfehlerausgabe umleiten .................................................................. 79

1.10.3 Eingabe umleiten ................................................................................................. 82

1.10.4 Pipes ......................................................................................................................... 85

1.10.5 Ein T-Stück mit tee ............................................................................................... 87

1.10.6 Ersatzmuster (Wildcards) .................................................................................. 89

1.10.7 Brace Extension (Bash und Korn-Shell only) ............................................... 94

1.10.8 Muster-Alternativen (Bash und Korn-Shell only) ...................................... 95

1.10.9 Tilde-Expansion (Bash und Korn-Shell only) ............................................... 95

1.11 Empfehlung ........................................................................................................................... 97

1.12 Übungen .................................................................................................................................. 97

2 Variablen 99

2.1 Grundlagen ............................................................................................................................ 99

2.1.1 Zugriff auf den Wert einer Variablen ............................................................ 99

2.1.2 Variablen-Interpolation ..................................................................................... 100

2.2 Zahlen ....................................................................................................................................... 105

2.2.1 Integer-Arithmetik (Bourne-Shell, Bash und Korn-Shell) ....................... 105

2.2.2 Integer-Arithmetik (Bash und Korn-Shell only) ......................................... 107

4087.book Seite 6 Freitag, 4. März 2016 1:00 13

Inhalt

7

2.2.3 bc – Rechnen mit Fließkommazahlen und mathe-

matischen Funktionen ....................................................................................... 111

2.3 Zeichenketten ....................................................................................................................... 115

2.3.1 Stringverarbeitung .............................................................................................. 115

2.3.2 Erweiterte Funktionen für Bash und Korn-Shell ........................................ 122

2.4 Quotings und Kommando-Substitution ................................................................... 127

2.4.1 Single und Double Quotings ............................................................................ 127

2.4.2 Kommando-Substitution – Back Quotes ..................................................... 130

2.5 Arrays (Bash und Korn-Shell only) ............................................................................... 132

2.5.1 Werte an Arrays zuweisen ................................................................................ 133

2.5.2 Eine Liste von Werten an ein Array zuweisen (Bash) ............................... 134

2.5.3 Eine Liste von Werten an ein Array zuweisen (Korn-Shell) .................... 134

2.5.4 Zugreifen auf die einzelnen Elemente eines Arrays ................................. 134

2.5.5 Assoziative Arrays ................................................................................................ 139

2.6 Variablen exportieren ....................................................................................................... 140

2.7 Umgebungsvariablen eines Prozesses ...................................................................... 145

2.8 Shell-Variablen ..................................................................................................................... 146

2.9 Automatische Variablen der Shell ............................................................................... 153

2.9.1 Der Name des Shellscripts – $0 ....................................................................... 153

2.9.2 Die Prozessnummer des Shellscripts – $$ .................................................... 154

2.9.3 Der Beendigungsstatus eines Shellscripts – $? .......................................... 155

2.9.4 Die Prozessnummer des zuletzt gestarteten Hintergrund-

prozesses – $! ........................................................................................................ 155

2.9.5 Weitere vordefinierte Variablen der Shell ................................................... 155

2.9.6 Weitere automatische Variablen für Bash und Korn-Shell .................... 156

2.10 Übungen .................................................................................................................................. 159

3 Parameter und Argumente 161

3.1 Einführung .............................................................................................................................. 161

3.2 Kommandozeilenparameter $1 bis $9 ....................................................................... 161

3.3 Besondere Parameter ........................................................................................................ 162

3.3.1 Die Variable $* ....................................................................................................... 163

3.3.2 Die Variable $@ .................................................................................................... 164

3.3.3 Die Variable $# ...................................................................................................... 165

4087.book Seite 7 Freitag, 4. März 2016 1:00 13

Page 43: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

8

3.4 Der Befehl shift .................................................................................................................... 166

3.5 Argumente und Leerzeichen .......................................................................................... 168

3.6 Argumente jenseits von $9 ............................................................................................. 168

3.7 Argumente setzen mit set und Kommando-Substitution ................................ 170

3.8 getopts – Kommandozeilenoptionen auswerten ................................................ 174

3.9 Vorgabewerte für Variablen .......................................................................................... 176

3.10 Aufgaben ................................................................................................................................ 180

4 Kontrollstrukturen 181

4.1 Bedingte Anweisung mit if ............................................................................................. 181

4.1.1 Kommandos testen mit if ................................................................................. 183

4.1.2 Kommandoverkettung über Pipes mit if ..................................................... 185

4.2 Die else-Alternative für eine if-Verzweigung ......................................................... 189

4.3 Mehrfache Alternative mit elif ..................................................................................... 191

4.4 Das Kommando test .......................................................................................................... 193

4.4.1 Ganze Zahlen vergleichen ................................................................................. 194

4.4.2 Ganze Zahlen vergleichen mit let (Bash und Korn-Shell only) ............. 197

4.4.3 Zeichenketten vergleichen ............................................................................... 198

4.4.4 Zeichenketten vergleichen (Bash und Korn-Shell only) .......................... 203

4.5 Status von Dateien erfragen .......................................................................................... 205

4.6 Logische Verknüpfung von Ausdrücken ................................................................... 209

4.6.1 Der Negationsoperator ! .................................................................................... 210

4.6.2 Die UND-Verknüpfung (-a und &&) .............................................................. 211

4.6.3 Die ODER-Verknüpfung (-o und ||) ................................................................. 212

4.6.4 Klammerung und mehrere logische Verknüpfungen .............................. 213

4.7 Short Circuit-Tests – ergebnisabhängige Befehlsausführung ........................ 215

4.8 Die Anweisung case ........................................................................................................... 218

4.8.1 Alternative Vergleichsmuster .......................................................................... 220

4.8.2 case und Wildcards ............................................................................................. 222

4.8.3 case und Optionen ............................................................................................... 224

4.8.4 Neuerungen in der Bash 4.x ............................................................................. 225

4.9 Schleifen .................................................................................................................................. 226

4.9.1 Die for-Schleife ..................................................................................................... 227

4087.book Seite 8 Freitag, 4. März 2016 1:00 13

Inhalt

9

4.9.2 Die while-Schleife ................................................................................................ 237

4.9.3 Die until-Schleife .................................................................................................. 241

4.10 Kontrollierte Sprünge ........................................................................................................ 243

4.10.1 Der Befehl continue ............................................................................................ 244

4.10.2 Der Befehl break ................................................................................................... 246

4.11 Endlosschleifen .................................................................................................................... 247

4.12 Aufgaben ................................................................................................................................ 249

5 Terminal-Ein- und -Ausgabe 251

5.1 Von Terminals zu Pseudo-Terminals .......................................................................... 251

5.2 Ausgabe ................................................................................................................................... 253

5.2.1 Der echo-Befehl .................................................................................................... 254

5.2.2 print (Korn-Shell only) ........................................................................................ 259

5.2.3 Der Befehl printf ................................................................................................... 259

5.2.4 Der Befehl tput – Terminalsteuerung ........................................................... 263

5.3 Eingabe .................................................................................................................................... 268

5.3.1 Der Befehl read ..................................................................................................... 268

5.3.2 (Zeilenweises) Lesen einer Datei mit read ................................................... 270

5.3.3 Zeilenweise mit einer Pipe aus einem Kommando lesen (read) .......... 272

5.3.4 Here-Dokumente (Inline-Eingabeumleitung) ............................................ 273

5.3.5 Here-Dokumente mit read verwenden ........................................................ 277

5.3.6 Die Variable IFS ..................................................................................................... 278

5.3.7 Arrays einlesen mit read (Bash und Korn-Shell only) ............................... 283

5.3.8 Shell-abhängige Anmerkungen zu read ....................................................... 285

5.3.9 Ein einzelnes Zeichen abfragen ....................................................................... 285

5.3.10 Einzelne Zeichen mit Escape-Sequenzen abfragen .................................. 287

5.3.11 Passworteingabe .................................................................................................. 293

5.4 Umlenken mit dem Befehl exec ................................................................................... 294

5.5 Filedeskriptoren ................................................................................................................... 297

5.5.1 Einen neuen Filedeskriptor verwenden ........................................................ 298

5.5.2 Die Umlenkung <> ............................................................................................... 303

5.6 Named Pipes .......................................................................................................................... 304

5.7 Menüs mit select (Bash und Korn-Shell only) ......................................................... 307

5.8 Aufgaben ................................................................................................................................ 312

4087.book Seite 9 Freitag, 4. März 2016 1:00 13

Page 44: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

10

6 Funktionen 313

6.1 Definition ................................................................................................................................ 313

6.1.1 Definition (Bash und Korn-Shell only) ........................................................... 314

6.1.2 Funktionsaufruf .................................................................................................... 314

6.1.3 Funktionen exportieren ..................................................................................... 316

6.1.4 Aufrufreihenfolge ................................................................................................ 318

6.1.5 Who is who ............................................................................................................ 318

6.1.6 Aufruf selbst bestimmen .................................................................................. 319

6.1.7 Funktionen auflisten ........................................................................................... 320

6.2 Funktionen, die Funktionen aufrufen ....................................................................... 320

6.3 Parameterübergabe ........................................................................................................... 322

6.3.1 FUNCNAME (Bash only) ..................................................................................... 324

6.4 Rückgabewert aus einer Funktion ............................................................................... 325

6.4.1 Rückgabewert mit return .................................................................................. 326

6.4.2 Rückgabewert mit echo und einer Kommando-Substitution ............... 327

6.4.3 Rückgabewert ohne eine echte Rückgabe (lokale Variable) .................. 329

6.4.4 Funktionen und exit ............................................................................................ 330

6.5 Lokale contra globale Variablen ................................................................................... 330

6.5.1 Lokale Variablen (Bash und Korn-Shell only) .............................................. 333

6.6 alias und unalias .................................................................................................................. 334

6.7 Autoload (Korn-Shell only) ............................................................................................. 337

6.8 Aufgaben ................................................................................................................................ 338

7 Signale 339

7.1 Grundlagen zu den Signalen .......................................................................................... 339

7.2 Signale senden – kill .......................................................................................................... 344

7.3 Eine Fallgrube für Signale – trap .................................................................................. 344

7.3.1 Einen Signalhandler (Funktion) einrichten ................................................. 347

7.3.2 Mit Signalen Schleifendurchläufe abbrechen ............................................ 350

7.3.3 Mit Signalen das Script beenden .................................................................... 351

7.3.4 Das Beenden der Shell (oder eines Scripts) abfangen ............................. 351

7.3.5 Signale ignorieren ................................................................................................ 353

7.3.6 Signale zurücksetzen .......................................................................................... 354

7.4 Aufgabe ................................................................................................................................... 355

4087.book Seite 10 Freitag, 4. März 2016 1:00 13

Inhalt

11

8 Rund um die Ausführung von Scripts und Prozessen357

8.1 Prozessprioritäten ............................................................................................................... 357

8.2 Warten auf andere Prozesse .......................................................................................... 358

8.3 Hintergrundprozess wieder hervorholen ................................................................. 359

8.4 Hintergrundprozess schützen ....................................................................................... 360

8.5 Subshells ................................................................................................................................. 361

8.6 Mehrere Scripts verbinden und ausführen (Kommunikation

zwischen Scripts) ................................................................................................................. 363

8.6.1 Datenübergabe zwischen Scripts ................................................................... 363

8.6.2 Rückgabe von Daten an andere Scripts ........................................................ 365

8.6.3 Scripts synchronisieren ...................................................................................... 368

8.7 Jobverwaltung ...................................................................................................................... 370

8.8 Shellscripts zeitgesteuert ausführen ......................................................................... 373

8.9 Startprozess- und Profildaten der Shell .................................................................... 378

8.9.1 Arten von Initialisierungsdateien ................................................................... 379

8.9.2 Ausführen von Profildateien beim Start einer Login-Shell .................... 379

8.9.3 Ausführen von Profildateien beim Start einer Nicht-Login-Shell

(Bash und Korn-Shell) ......................................................................................... 382

8.9.4 Zusammenfassung alle Profil- und Startup-Dateien ............................... 384

8.10 Ein Shellscript bei der Ausführung .............................................................................. 385

8.10.1 Syntaxüberprüfung ............................................................................................. 386

8.10.2 Expansionen .......................................................................................................... 386

8.10.3 Kommandos ........................................................................................................... 386

8.11 Shellscripts optimieren ..................................................................................................... 387

8.12 Aufgaben ................................................................................................................................ 390

9 Nützliche Funktionen 391

9.1 Der Befehl eval ..................................................................................................................... 391

9.2 xargs .......................................................................................................................................... 394

9.3 dirname und basename ................................................................................................... 396

4087.book Seite 11 Freitag, 4. März 2016 1:00 13

Page 45: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

12

9.4 umask ....................................................................................................................................... 397

9.5 ulimit (Builtin) ...................................................................................................................... 398

9.6 time ........................................................................................................................................... 400

9.7 typeset ..................................................................................................................................... 401

9.8 Aufgabe ................................................................................................................................... 402

10 Fehlersuche und Debugging 403

10.1 Strategien zum Vermeiden von Fehlern ................................................................... 403

10.1.1 Planen Sie Ihr Script ............................................................................................. 403

10.1.2 Testsystem bereitstellen ................................................................................... 404

10.1.3 Ordnung ist das halbe Leben ........................................................................... 404

10.2 Fehlerarten ............................................................................................................................. 407

10.3 Fehlersuche ............................................................................................................................ 408

10.3.1 Tracen mit set -x ................................................................................................... 409

10.3.2 Das DEBUG- und das ERR-Signal ..................................................................... 411

10.3.3 Variablen und Syntax überprüfen .................................................................. 415

10.3.4 Eine Debug-Ausgabe hinzufügen ................................................................... 416

10.3.5 Debugging-Tools .................................................................................................. 417

11 Reguläre Ausdrücke und grep 419

11.1 Reguläre Ausdrücke – die Theorie ............................................................................... 419

11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE) ............................................. 420

11.1.2 Zusammenfassung .............................................................................................. 423

11.2 grep ............................................................................................................................................ 423

11.2.1 Wie arbeitet grep? ............................................................................................... 424

11.2.2 grep mit regulären Ausdrücken ...................................................................... 425

11.2.3 grep mit Pipes ........................................................................................................ 431

11.2.4 grep mit Optionen ............................................................................................... 432

11.2.5 egrep (extended grep) ........................................................................................ 435

11.2.6 fgrep (fixed oder fast grep) ............................................................................... 436

11.2.7 rgrep ......................................................................................................................... 436

11.3 Aufgaben ................................................................................................................................ 436

4087.book Seite 12 Freitag, 4. März 2016 1:00 13

Inhalt

13

12 Der Stream-Editor sed 437

12.1 Funktions- und Anwendungsweise von sed ........................................................... 437

12.1.1 Grundlegende Funktionsweise ....................................................................... 437

12.1.2 Wohin mit der Ausgabe? ................................................................................... 439

12.2 Der sed-Befehl ...................................................................................................................... 441

12.3 Adressen .................................................................................................................................. 441

12.4 Kommandos, Substitutionsflags und Optionen von sed .................................. 443

12.4.1 Das a-Kommando – Zeile(n) anfügen ........................................................... 447

12.4.2 Das c-Kommando – Zeilen ersetzen .............................................................. 448

12.4.3 Das d-Kommando – Zeilen löschen ............................................................... 449

12.4.4 Die Kommandos h, H, g, G und x – Arbeiten mit den Puffern .............. 449

12.4.5 Das Kommando i – Einfügen von Zeilen ...................................................... 451

12.4.6 Das p-Kommando – Patternspace ausgeben ............................................. 451

12.4.7 Das Kommando q – Beenden ........................................................................... 453

12.4.8 Die Kommandos r und w ................................................................................... 453

12.4.9 Das Kommando s – substitute ........................................................................ 454

12.4.10 Das Kommando y ................................................................................................. 459

12.5 sed-Scripts .............................................................................................................................. 460

12.6 Aufgaben ................................................................................................................................ 463

13 awk-Programmierung 465

13.1 Einführung und Grundlagen von awk ....................................................................... 465

13.1.1 History und Versionen von awk ...................................................................... 466

13.1.2 Die Funktionsweise von awk ............................................................................ 467

13.2 Aufruf von awk-Programmen ....................................................................................... 468

13.2.1 Grundlegender Aufbau eines awk-Kommandos ....................................... 468

13.2.2 Die Kommandozeilen-Optionen von awk ................................................... 470

13.2.3 awk aus der Kommandozeile aufrufen ........................................................ 471

13.2.4 awk in Shellscripts aufrufen ............................................................................. 471

13.2.5 awk als eigenes Script ausführen ................................................................... 472

13.3 Grundlegende awk-Programme und -Elemente ................................................... 473

13.3.1 Ausgabe von Zeilen und Zeilennummern ................................................... 473

13.3.2 Felder ........................................................................................................................ 475

13.4 Muster (bzw. Adressen) von awk-Scripts ................................................................. 479

13.4.1 Zeichenkettenvergleiche ................................................................................... 480

4087.book Seite 13 Freitag, 4. März 2016 1:00 13

Page 46: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

14

13.4.2 Vergleichsausdrücke ........................................................................................... 480

13.4.3 Reguläre Ausdrücke ............................................................................................. 483

13.4.4 Zusammengesetzte Ausdrücke ....................................................................... 485

13.4.5 BEGIN und END ..................................................................................................... 486

13.5 Die Komponenten von awk-Scripts ............................................................................ 487

13.5.1 Variablen ................................................................................................................. 488

13.5.2 Arrays ....................................................................................................................... 493

13.5.3 Operatoren ............................................................................................................. 496

13.5.4 Kontrollstrukturen ............................................................................................... 503

13.6 Funktionen ............................................................................................................................. 508

13.6.1 Mathematische Funktionen ............................................................................. 509

13.6.2 Funktionen für Zeichenketten ......................................................................... 510

13.6.3 Funktionen für die Zeit ....................................................................................... 514

13.6.4 Systemfunktionen ............................................................................................... 517

13.6.5 Ausgabefunktionen ............................................................................................. 517

13.6.6 Eingabefunktion ................................................................................................... 518

13.6.7 Benutzerdefinierte Funktionen ....................................................................... 521

13.7 Empfehlung ........................................................................................................................... 523

13.8 Aufgaben ................................................................................................................................ 524

14 Linux/UNIX-Kommandoreferenz 525

14.1 Kurzübersicht ........................................................................................................................ 526

14.2 Dateiorientierte Kommandos ....................................................................................... 535

14.2.1 bzcat – Ausgabe von bzip2-komprimierten Dateien ............................... 535

14.2.2 cat – Datei(en) nacheinander ausgeben ...................................................... 536

14.2.3 chgrp – Gruppe von Dateien oder Verzeichnissen ändern .................... 536

14.2.4 cksum/md5sum/sum – eine Prüfsumme für eine Datei ermitteln .... 536

14.2.5 chmod – Zugriffsrechte von Dateien oder Verzeichnissen ändern ..... 538

14.2.6 chown – Eigentümer von Dateien oder Verzeichnissen ändern .......... 539

14.2.7 cmp – Dateien miteinander vergleichen ...................................................... 539

14.2.8 comm – zwei sortierte Textdateien miteinander vergleichen ............. 539

14.2.9 cp – Dateien kopieren ......................................................................................... 540

14.2.10 csplit – Zerteilen von Dateien (kontextabhängig) .................................... 541

14.2.11 cut – Zeichen oder Felder aus Dateien herausschneiden ....................... 542

14.2.12 diff – Vergleichen zweier Dateien .................................................................. 542

14.2.13 diff3 – Vergleich von drei Dateien .................................................................. 543

14.2.14 dos2unix – Dateien vom DOS- ins UNIX-Format umwandeln .............. 543

4087.book Seite 14 Freitag, 4. März 2016 1:00 13

Inhalt

15

14.2.15 expand – Tabulatoren in Leerzeichen umwandeln .................................. 543

14.2.16 file – den Inhalt von Dateien analysieren .................................................... 544

14.2.17 find – Suchen nach Dateien ............................................................................. 545

14.2.18 fold – einfaches Formatieren von Dateien .................................................. 545

14.2.19 head – Anfang einer Datei ausgeben ............................................................ 546

14.2.20 less – Datei(en) seitenweise ausgeben ......................................................... 547

14.2.21 ln – Links auf eine Datei erzeugen ................................................................. 547

14.2.22 ls – Verzeichnisinhalt auflisten ....................................................................... 548

14.2.23 more – Datei(en) seitenweise ausgeben ...................................................... 548

14.2.24 mv – Datei(en) und Verzeichnisse verschieben oder umbenennen ... 548

14.2.25 nl – Datei mit Zeilennummer ausgeben ...................................................... 548

14.2.26 od – Datei(en) hexadezimal bzw. oktal ausgeben .................................... 549

14.2.27 paste – Dateien spaltenweise verknüpfen .................................................. 549

14.2.28 pcat – Ausgabe von pack-komprimierten Dateien ................................... 550

14.2.29 rm – Dateien und Verzeichnisse löschen ..................................................... 550

14.2.30 sort – Dateien sortieren ..................................................................................... 550

14.2.31 split – Dateien in mehrere Teile zerlegen .................................................... 551

14.2.32 tac – Dateien rückwärts ausgeben ................................................................ 552

14.2.33 tail – Das Ende einer Datei ausgeben ........................................................... 552

14.2.34 tee – Ausgabe duplizieren ................................................................................. 553

14.2.35 touch – Dateien anlegen oder Zeitstempel verändern ........................... 553

14.2.36 tr – Zeichen ersetzen bzw. Dateien umformen ......................................... 553

14.2.37 type – Kommandos klassifizieren ................................................................... 554

14.2.38 umask – Dateierstellungsmaske ändern bzw. ausgeben ....................... 554

14.2.39 uniq – doppelte Zeilen nur einmal ausgeben ............................................. 554

14.2.40 uuencode/uudecode – Text- bzw. Binärdateien codieren ..................... 555

14.2.41 unix2dos – Dateien vom UNIX- ins DOS-Format umwandeln .............. 555

14.2.42 wc – Zeilen, Wörter und Zeichen einer Datei zählen ............................... 555

14.2.43 whereis – Suche nach Dateien ........................................................................ 556

14.2.44 zcat, zless, zmore – (seitenweise) Ausgabe von gunzip-

komprimierten Dateien ..................................................................................... 556

14.3 Verzeichnisorientierte Kommandos ........................................................................... 556

14.3.1 basename – gibt den Dateianteil eines Pfadnamens zurück ................ 556

14.3.2 cd – Verzeichnis wechseln ................................................................................ 557

14.3.3 dircmp – Verzeichnisse rekursiv vergleichen .............................................. 557

14.3.4 dirname – Verzeichnisanteil eines Pfadnamens zurückgeben ............. 557

14.3.5 mkdir – ein Verzeichnis anlegen ..................................................................... 557

14.3.6 pwd – Ausgeben des aktuellen Arbeitsverzeichnisses ............................ 558

14.3.7 rmdir – ein leeres Verzeichnis löschen ......................................................... 558

14.4 Verwaltung von Benutzern und Gruppen ................................................................ 558

14.4.1 exit, logout – eine Session (Sitzung) beenden ........................................... 558

4087.book Seite 15 Freitag, 4. März 2016 1:00 13

Page 47: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

16

14.4.2 finger – Informationen zu anderen Benutzern abfragen ....................... 558

14.4.3 groupadd, groupmod, groupdel – Gruppenverwaltung

(distributionsabhängig) ..................................................................................... 559

14.4.4 groups – Gruppenzugehörigkeit ausgeben ................................................. 559

14.4.5 id – eigene Benutzer- und Gruppen-ID ermitteln ..................................... 559

14.4.6 last – An- und Abmeldezeit eines Benutzers ermitteln .......................... 560

14.4.7 logname – Name des aktuellen Benutzers anzeigen ............................... 560

14.4.8 newgrp – Gruppenzugehörigkeit kurzzeitig wechseln

(betriebssystemspezifisch) ............................................................................... 560

14.4.9 passwd – Passwort ändern bzw. vergeben ................................................. 560

14.4.10 useradd/adduser, userdel, usermod – Benutzerverwaltung

(distributionsabhängig) ..................................................................................... 561

14.4.11 who – eingeloggte Benutzer anzeigen ......................................................... 562

14.4.12 whoami – Name des aktuellen Benutzers anzeigen ................................ 562

14.5 Programm- und Prozessverwaltung ........................................................................... 563

14.5.1 at – Kommando zu einem bestimmten Zeitpunkt ausführen lassen 563

14.5.2 batch – Kommando irgendwann später ausführen lassen ................... 563

14.5.3 bg – einen angehaltenen Prozess im Hintergrund fortsetzen ............. 564

14.5.4 cron/crontab – Programme in bestimmten Zeitintervallen

ausführen lassen .................................................................................................. 564

14.5.5 fg – einen angehaltenen Prozess im Vordergrund fortsetzen .............. 564

14.5.6 jobs – Anzeigen angehaltener bzw. im Hintergrund laufender

Prozesse ................................................................................................................... 564

14.5.7 kill – Signale an Prozesse mit einer Prozessnummer senden ............... 564

14.5.8 killall – Signale an Prozesse mit einem Prozessnamen senden ........... 565

14.5.9 nice – Prozesse mit anderer Priorität ausführen lassen ......................... 565

14.5.10 nohup – Prozesse beim Beenden einer Sitzung weiterlaufen

lassen ....................................................................................................................... 565

14.5.11 ps – Prozessinformationen anzeigen ............................................................ 566

14.5.12 pgrep – Prozesse über ihren Namen finden ................................................ 567

14.5.13 pstree – Prozesshierarchie in Baumform ausgeben ................................. 567

14.5.14 renice – Priorität laufender Prozesse verändern ....................................... 567

14.5.15 sleep – Prozesse suspendieren (schlafen legen) ........................................ 567

14.5.16 su – Ändern der Benutzerkennung (ohne Neuanmeldung) .................. 568

14.5.17 sudo – ein Programm als anderer Benutzer ausführen .......................... 568

14.5.18 time – Zeitmessung für Prozesse ................................................................... 569

14.5.19 top – Prozesse nach CPU-Auslastung anzeigen

(betriebssystemspezifisch) ............................................................................... 569

14.6 Speicherplatzinformationen .......................................................................................... 570

14.6.1 df – Abfrage des benötigten Speicherplatzes für

die Dateisysteme .................................................................................................. 570

4087.book Seite 16 Freitag, 4. März 2016 1:00 13

Inhalt

17

14.6.2 du – Größe eines Verzeichnisbaums ermitteln ......................................... 570

14.6.3 free – verfügbaren Speicherplatz (RAM und Swap) anzeigen

(betriebssystemabhängig) ................................................................................ 571

14.6.4 swap – Swap-Space anzeigen (nicht Linux) ................................................ 571

14.7 Dateisystem-Kommandos .............................................................................................. 571

14.7.1 badblocks – überprüft, ob ein Datenträger defekte Sektoren hat ...... 572

14.7.2 cfdisk – Partitionieren von Festplatten ........................................................ 572

14.7.3 dd – Datenblöcke zwischen Devices (Low Level) kopieren (und

konvertieren) ......................................................................................................... 573

14.7.4 dd_rescue – fehlertolerantes Kopieren von Dateiblöcken ..................... 575

14.7.5 dumpe2fs – zeigt Informationen über ein ext2/ext3-

Dateisystem an ..................................................................................................... 575

14.7.6 e2fsck – repariert ein ext2/ext3-Dateisystem ............................................ 576

14.7.7 fdformat – formatiert eine Diskette .............................................................. 577

14.7.8 fdisk – Partitionieren von Speichermedien ................................................. 577

14.7.9 fsck – Reparieren und Überprüfen von Dateisystemen .......................... 579

14.7.10 mkfs – Dateisystem einrichten ....................................................................... 580

14.7.11 mkswap – eine Swap-Partition einrichten .................................................. 580

14.7.12 mount, umount – An- bzw. Abhängen eines Dateisystems .................. 581

14.7.13 parted – Partitionen anlegen, verschieben, vergrößern oder

verkleinern .............................................................................................................. 582

14.7.14 prtvtoc – Partitionstabellen ausgeben ......................................................... 582

14.7.15 swapon, swapoff – Swap-Datei oder Partition (de)aktivieren .............. 582

14.7.16 sync – alle gepufferten Schreiboperationen ausführen ......................... 583

14.8 Archivierung und Backup ................................................................................................ 583

14.8.1 bzip2/bunzip2 – (De-)Komprimieren von Dateien ................................... 583

14.8.2 compress/uncompress – (De-)Komprimieren von Dateien ................... 584

14.8.3 cpio, afio – Dateien und Verzeichnisse archivieren .................................. 584

14.8.4 crypt – Dateien verschlüsseln .......................................................................... 587

14.8.5 dump/restore bzw. ufsdump/ufsrestore – Vollsicherung bzw.

Wiederherstellen eines Dateisystems .......................................................... 588

14.8.6 gzip/gunzip – (De-)Komprimieren von Dateien ........................................ 590

14.8.7 mt – Streamer steuern ....................................................................................... 591

14.8.8 pack/unpack – (De-)Komprimieren von Dateien ...................................... 592

14.8.9 tar – Dateien und Verzeichnisse archivieren .............................................. 592

14.8.10 zip/unzip – (De-)Komprimieren von Dateien ............................................. 596

14.8.11 Übersicht über Dateiendungen und über die Pack-Programme .......... 597

14.9 Systeminformationen ....................................................................................................... 598

14.9.1 cal – zeigt einen Kalender an ........................................................................... 598

14.9.2 date – Datum und Uhrzeit ................................................................................ 599

4087.book Seite 17 Freitag, 4. März 2016 1:00 13

Page 48: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

18

14.9.3 uname – Rechnername, Architektur und OS ausgeben ........................ 599

14.9.4 uptime – Laufzeit des Rechners .................................................................... 599

14.10 System-Kommandos ......................................................................................................... 600

14.10.1 dmesg – letzte Boot-Meldung des Kernels anzeigen ............................ 600

14.10.2 halt – alle laufenden Prozesse beenden .................................................... 600

14.10.3 reboot – alle laufenden Prozesse beenden und System

neu starten ........................................................................................................... 600

14.10.4 shutdown – System herunterfahren ........................................................... 600

14.11 Druckeradministration ..................................................................................................... 602

14.12 Netzwerkbefehle ................................................................................................................. 602

14.12.1 arp – Ausgeben von MAC-Adressen ............................................................ 603

14.12.2 ftp – Dateien zu einem anderen Rechner übertragen ........................... 603

14.12.3 hostname – Rechnername ermitteln .......................................................... 608

14.12.4 ifconfig – Netzwerkzugang konfigurieren ................................................ 608

14.12.5 mail/mailx – E-Mails schreiben und empfangen (und auswerten) ... 610

14.12.6 netstat – Statusinformationen über das Netzwerk ............................... 611

14.12.7 nslookup (host/dig) – DNS-Server abfragen ............................................. 612

14.12.8 ping – die Verbindung zu einem anderen Rechner testen .................. 612

14.12.9 Die r-Kommandos von Berkeley (rcp, rlogin, rsh, rwho) ....................... 613

14.12.10 ssh – sichere Shell auf anderem Rechner starten ................................... 614

14.12.11 scp – Dateien zwischen unterschiedlichen Rechnern kopieren ......... 615

14.12.12 rsync – Replizieren von Dateien und Verzeichnissen ............................ 616

14.12.13 traceroute – Route zu einem Rechner verfolgen ..................................... 618

14.13 Benutzerkommunikation ................................................................................................ 619

14.13.1 wall – Nachrichten an alle Benutzer verschicken ................................... 619

14.13.2 write – Nachrichten an andere Benutzer verschicken .......................... 619

14.13.3 mesg – Nachrichten auf die Dialogstation zulassen oder

unterbinden ......................................................................................................... 619

14.14 Bildschirm- und Terminalkommandos ...................................................................... 620

14.14.1 clear – Löschen des Bildschirms .................................................................... 620

14.14.2 reset – Zeichensatz für ein Terminal wiederherstellen ........................ 620

14.14.3 setterm – Terminal-Einstellung verändern ............................................... 620

14.14.4 stty – Terminal-Einstellung abfragen oder setzen ................................. 621

14.14.5 tty – Terminal-Name erfragen ...................................................................... 622

14.14.6 tput – Terminal- und Cursorsteuerung ...................................................... 622

14.15 Online-Hilfen ......................................................................................................................... 623

14.15.1 apropos – nach Schlüsselwörtern in Manpages suchen ...................... 623

14.15.2 info – GNU-Online-Manual ............................................................................ 623

4087.book Seite 18 Freitag, 4. März 2016 1:00 13

Inhalt

19

14.15.3 man – die traditionelle Online-Hilfe ........................................................... 623

14.15.4 whatis – Kurzbeschreibung zu einem Kommando ................................ 624

14.16 Alles rund um PostScript-Kommandos ..................................................................... 625

14.17 Gemischte Kommandos ................................................................................................... 625

14.17.1 alias/unalias – Kurznamen für Kommandos vergeben bzw.

löschen ..................................................................................................................... 625

14.17.2 bc – Taschenrechner ........................................................................................... 625

14.17.3 printenv bzw. env – Umgebungsvariablen anzeigen .............................. 626

15 Die Praxis 627

15.1 Alltägliche Lösungen ......................................................................................................... 628

15.1.1 Auf alphabetische und numerische Zeichen prüfen ................................ 628

15.1.2 Auf Integer überprüfen ...................................................................................... 629

15.1.3 echo mit oder ohne -n ........................................................................................ 631

15.2 Datei-Utilitys ......................................................................................................................... 632

15.2.1 Leerzeichen im Dateinamen ersetzen ........................................................... 632

15.2.2 Dateiendungen verändern ................................................................................ 633

15.2.3 Veränderte Dateien in zwei Verzeichnissen vergleichen ....................... 634

15.2.4 Dateien in mehreren Verzeichnissen ändern ............................................. 636

15.3 Systemadministration ...................................................................................................... 645

15.3.1 Benutzerverwaltung ........................................................................................... 646

15.3.2 Systemüberwachung .......................................................................................... 664

15.4 Backup-Strategien .............................................................................................................. 670

15.4.1 Warum ein Backup? ............................................................................................ 670

15.4.2 Sicherungsmedien ............................................................................................... 671

15.4.3 Varianten der Sicherungen ............................................................................... 672

15.4.4 Bestimmte Bereiche sichern ............................................................................. 672

15.4.5 Backup über ssh mit tar ..................................................................................... 673

15.4.6 Daten mit rsync synchronisieren .................................................................... 680

15.4.7 Dateien und Verzeichnisse per E-Mail versenden ..................................... 683

15.4.8 Startup-Scripts ...................................................................................................... 686

15.5 Das World Wide Web und HTML .................................................................................. 693

15.5.1 Analysieren von access_log (Apache) ........................................................... 694

15.5.2 Analysieren von error_log (Apache) .............................................................. 697

15.6 CGI (Common Gateway Interface) ............................................................................... 700

15.6.1 CGI-Scripts ausführen ........................................................................................ 701

4087.book Seite 19 Freitag, 4. März 2016 1:00 13

Page 49: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Inhalt

20

15.6.2 CGI-Environment ausgeben ............................................................................. 702

15.6.3 Einfache Ausgabe als Text ................................................................................ 703

15.6.4 Ausgabe als HTML formatieren ....................................................................... 706

15.6.5 Systeminformationen ausgeben .................................................................... 709

15.6.6 Kontaktformular .................................................................................................. 711

15.6.7 Noch ein Tipp ......................................................................................................... 714

16 GUIs und Grafiken 715

16.1 dialog und Xdialog ............................................................................................................. 715

16.1.1 --yesno – Entscheidungsfrage ......................................................................... 716

16.1.2 --msgbox – Nachrichtenbox mit Bestätigung ............................................ 718

16.1.3 --infobox – Hinweisfenster ohne Bestätigung ........................................... 719

16.1.4 --inputbox – Text-Eingabezeile ....................................................................... 720

16.1.5 --textbox – ein einfacher Dateibetrachter .................................................. 721

16.1.6 --menu – ein Menü erstellen ............................................................................ 722

16.1.7 --checklist – Auswahlliste zum Ankreuzen ................................................. 723

16.1.8 --radiolist – Radiobuttons zum Auswählen ................................................ 724

16.1.9 --gauge – Fortschrittszustand anzeigen ...................................................... 724

16.1.10 Verändern von Aussehen und Ausgabe ....................................................... 726

16.1.11 Ein kleines Beispiel ............................................................................................... 727

16.1.12 Zusammenfassung .............................................................................................. 728

16.2 gnuplot – Visualisierung von Messdaten ................................................................. 729

16.2.1 Wozu wird gnuplot eingesetzt? ...................................................................... 729

16.2.2 gnuplot starten ..................................................................................................... 730

16.2.3 Das Kommando zum Plotten ........................................................................... 731

16.2.4 Variablen und Parameter für gnuplot ........................................................... 732

16.2.5 Ausgabe von gnuplot umleiten ....................................................................... 734

16.2.6 Variablen und eigene Funktionen definieren ............................................. 735

16.2.7 Interpretation von Daten aus einer Datei ................................................... 736

16.2.8 Alles bitte nochmals zeichnen (oder besser speichern und laden) ..... 739

16.2.9 gnuplot aus einem Shellscript heraus starten (der Batch-Betrieb) ..... 740

16.2.10 Plot-Styles und andere Ausgaben festlegen ............................................... 742

16.2.11 Tricks für die Achsen ........................................................................................... 748

16.2.12 Die dritte Dimension ........................................................................................... 752

16.2.13 Zusammenfassung .............................................................................................. 754

16.3 Aufgaben ................................................................................................................................ 755

4087.book Seite 20 Freitag, 4. März 2016 1:00 13

Inhalt

21

Anhang 757

A Befehle (Übersichtstabellen) ......................................................................................... 759

A.1 Shell-Builtin-Befehle ........................................................................................... 759

A.2 Externe Kommandos .......................................................................................... 762

A.3 Shell-Optionen ...................................................................................................... 763

A.4 Shell-Variablen ...................................................................................................... 765

A.5 Kommandozeile editieren ................................................................................. 773

A.6 Wichtige Tastenkürzel (Kontrolltasten) ....................................................... 775

A.7 Initialisierungsdateien der Shells ................................................................... 776

A.8 Signale ..................................................................................................................... 778

A.9 Sonderzeichen und Zeichenklassen ............................................................... 780

B Lösungen der Übungsaufgaben .................................................................................... 783

B.1 Kapitel 1 ................................................................................................................... 783

B.2 Kapitel 2 ................................................................................................................... 783

B.3 Kapitel 3 ................................................................................................................... 784

B.4 Kapitel 4 .................................................................................................................. 785

B.5 Kapitel 5 ................................................................................................................... 787

B.6 Kapitel 6 .................................................................................................................. 792

B.7 Kapitel 7 ................................................................................................................... 796

B.8 Kapitel 8 .................................................................................................................. 798

B.9 Kapitel 9 .................................................................................................................. 798

B.10 Kapitel 11 .................................................................................................................. 799

B.11 Kapitel 12 ................................................................................................................. 799

B.12 Kapitel 13 ................................................................................................................. 800

B.13 Kapitel 16 ................................................................................................................. 801

C Trivia ......................................................................................................................................... 803

C.1 Tastenunterschiede zwischen Mac- und PC-Tastaturen ........................ 803

C.2 Zusatzmaterial ...................................................................................................... 804

Index ........................................................................................................................................................ 805

4087.book Seite 21 Freitag, 4. März 2016 1:00 13

Page 50: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

805

Index

` (Back Quotes) 130

_ 773

;;& 225

!(...|...) 95

!=-Operator 198, 203

!-Operator 210

? 91

?(...|...) 95

. (Punkt) 52

.. (zwei Punkte) 52

.-Operator 67, 143, 317

' (Single Quote) 127

" (Double Quote) 127

( ) (Subshell) 361

@(...|...) 95

* 90

*(...|...) 95

/ 51

/dev/null 79

/dev/pts 253

/dev/ttyp* 253

/etc/inputrc 385

/etc/profile 379, 384

/etc/termcap 263

/home 51

& 64

&&-Operator 210, 211

# 67

#! 65

%-Operator 245

+(...|...) 95

<- Operator 203

<< (Here-Dokument) 273

<> (Umlenkung) 303

==-Operator 203

=-Operator 198

>-Operator 203

| (Pipe) 85

||-Operator 210, 212

~ 95

$_ 156

$! 155

$? 155

$(...) 132

${var:?wort} 178

${var:+wort} 178

${var:=wort} 178

${var:-wort} 178

$@ 156, 164

$* 156, 163

$# 156, 165

$$ 154

$0 153

$1 .. $9 161

$HOME/.profile 384

A

access_log 694

adduser 657

afio 584

alias 38, 334, 625

allow_null_glob_expansion 152

anacron 374

Apache

access_log 694

error_log 697

Fehler-Logdateien analysieren 697

Logdateien analysieren 694

apropos 623

Argumente 161

Anzahl 165

jenseits $9 168

Leerzeichen 168

setzen 170

Vorgabewerte setzen 176

Arithmetische Operatoren 110

arp 603

Arrays 132

assoziative 139

einlesen mit read 283

Elemente löschen 136

for 234

kopieren 136

Liste von Werten zuweisen 134

löschen 136

negative 135

String-Manipulation 136

Werte zuweisen 133

Zugriff auf alle Elemente 135

Zugriff auf Elemente 134

ash 41

A-Shell 41

Assoziative Arrays 240

4087.book Seite 805 Freitag, 4. März 2016 1:00 13

Page 51: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

806

at 563

Aufrufreihenfolge 318

Ausführzeit ermitteln 400

Ausgabe 253

Bildschirm löschen 263

echo 46, 254

print 259

printf 259

tput 263

umlenken mit exec 294

autoload 337

Autovervollständigung 775

awk 120

$0 492

Adressen 479

Aktionsteil 468

Anzahl Felder 475

ARGC 490, 491

ARGV 490, 491

arithmetische Operatoren 498

Array 493

assoziative Arrays 494

Aufbau 468

Aufruf 468

Ausgabefunktionen 517

Bedingungsoperatoren 500

BEGIN-Block 486

benutzerdefinierte Funktionen 521

break 508

close 518

continue 508

Dekrementoperator 501

do while-Schleife 506

Einführung 465

Eingabefunktionen 518

Elemente 473

END-Block 486

ENVIRON 491

exit 508

Felder ausgeben 475

Feldoperator 501

FILENAME 491

FNR 491

formatierte Ausgabe 477

for-Schleife 505

FS 492

function 521

Funktionen 508

gawk 466

getline 518

gsub 510

awk (Forts.)

History 466

if-Verzweigung 503

index 511

Inkrementoperator 501

Kommandozeile 471

Kommandozeilen-Argumente 490

Kommandozeilenoptionen 470

Kontext 496

Kontrollstrukturen 503

Leerzeichen 501

length 512

logische Operatoren 499

match 512

mathematische Funktionen 509

Muster 479

Musterteil 468

nawk 466

next 508

NF 475, 492

NR 474, 492

oawk 466

ODER-Verknüpfung 485

OFMT 492

OFS 492

Operatoren 496

Optionen 470

ORS 492

print 517

reguläre Ausdrücke 483

RLENGTH 492

RS 492

RSTART 492

Script 472, 487

Shebang-Zeile 488

Shellscript 471

split 513

sprintf 513

Sprungbefehle 508

strftime 514

Stringfunktionen 121, 510

sub 510

SUBSEP 492

substr 513

Syntax 468

Systemfunktionen 517

systime 514

tolower 514

toupper 514

UND-Verknüpfung 485

Variablen 488

4087.book Seite 806 Freitag, 4. März 2016 1:00 13

Index

807

awk (Forts.)

Vergleichsausdrücke 480

Vergleichsoperatoren 480

Versionen 466

vordefinierte Variablen 491

while-Schleife 506

Wörter ausgeben 475

Zeichenkettenfunktionen 510

Zeichenkettenvergleiche 480

Zeilen ausgeben 473

Zeilennummer ausgeben 473

Zeitfunktionen 514

zusammengesetzte Ausdrücke 485

B

Back Quotes 130

Backup 670

cpio 683

Gründe dafür 670

gzip 683

mail 683

rsync 680

Sicherungsmedien 671

ssh 673

Strategien 672

synchronisieren 680

tar 673

uuencode 683

Varianten 672

badblocks 572

basename 396, 556

BASH 158

Bash 41

BASH_ENV 150, 383, 385

bash_login 381, 384

bash_logout 385

bash_profile 381, 384

BASH_VERSINFO 150

BASH_VERSION 158

bashrc 381, 383

batch 563

bc 111, 625

bin 114

dec 114

hex 114

Benutzerdefinierte Signale 339

Benutzeroberfläche 33

grafische Oberfläche 33

Kommandozeile 33

Benutzerverwaltung 646, 657

Betriebssystem 44

bg 372, 564

Bourne-Again-Shell 41

Bourne-Shell 40

Brace Extension 94

break 246

Builtin 38, 318, 319, 388

Builtin-Befehle 759

bunzip2 583

bzcat 535

bzip2 583

C

cal 598

case 218

esac 219

Kommandozeilenoptionen 224

Vergleichsmuster 220

Wildcards 222

cat 48, 536

cd 53, 557

cdable_vars 152

CDPATH 147

cfdisk 572

CGI-Scripts 700, 701

chgrp 536

chmod 61, 538

chown 539

cksum 536

clear 620

cmp 539

COLUMNS 148

comm 539

command_oriented_history 152

command.com 32

compress 584

continue 244

Core-Dump 339

cp 49, 540

cpio 584, 683

cron 374, 564

cron-Daemon 374

crontab 374

-e 378

Eintrag (Syntax) 375

-l 378

-r 378

crypt 587

csh 40

C-Shell 40

4087.book Seite 807 Freitag, 4. März 2016 1:00 13

Page 52: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

808

csplit 541

cut 115, 542

D

Daemon-Prozess 74

Daemons 373

anacron 374

cron 374

date 599

Dateiart 57

Dateiattribute 56

Dateien 56

Attribute 56

auflisten 47

ausgeben 48

Dateityp 57

Dateityp ermitteln 206

Endung verändern 633

erzeugen 50

Existenz überprüfen 207

kopieren 49

löschen 50

Namen 55

Namen mit Leerzeichen 632

Status ermitteln 205

suchen und ersetzen 454

umbenennen 49

Utilitys 632

vergleichen 634

verschieben 49

versteckte 93

Wörter zählen 48

Zeichen ersetzen 459

Zeichen zählen 48

Zeilen einfügen 447, 451

Zeilen ersetzen 448

Zeilen löschen 449

Zeilen zählen 48

zeilenweise einlesen 270

Zeitstempel vergleichen 207

Zugriffsrechte 57

Zugriffsrechte ermitteln 206

Dateikreierungsmaske 397

Dateiname 55

Dateinamen-Substitution 229

Dateityp 57

Datenfluss 77

Datenstrom 77

Ausgabe umleiten 78

Eingabe umleiten 82

Datenstrom (Forts.)

Fehlerausgabe umleiten 79

dd 286, 573

dd_rescue 575

Debian 459

Debuggen 71, 403, 408

DEBUG 411

Debug-Ausgabe 416

ERR 411

LINENO 413

Syntax überprüfen 416

tracen 409

Variablen überprüfen 415

Debugging-Tools 417

DEBUG-Signal 411

Deskriptoren 297

Device File 56

df 570, 664

dialog 715

--backtitle 726

--checklist (Auswahlliste zum

Ankreuzen) 723

--clear 726

--gauge (Fortschrittsanzeige) 724

--infobox (Hinweisfenster ohne

Bestätigung) 719

--inputbox (Text-Eingabezeile) 720

--menu (Menü) 722

--msgbox (Nachrichtenbox mit

Bestätigung) 718

--radiolist (Radiobuttons zum

Auswählen) 724

--textbox (Dateibetrachter) 721

--title 726

--yesno (Entscheidungsfrage) 716

Dialogfenster 715

diff 542

diff3 543

dig 612

dircmp 557

dirname 396, 557

DIRSTACK 150

dmesg 600

do 227

done 227

dos2unix 543

Double Quotes 127

Druckerbefehle 602

du 570

dump 588

dumpe2fs 575

4087.book Seite 808 Freitag, 4. März 2016 1:00 13

Index

809

E

e2fsck 576

echo 46, 254, 319, 631

gnuplot 741

Echtzeit-Prozesse 358

EDITOR 148

Editor 59

egrep 423, 435

Eingabe 268

Arrays einlesen 283

einzelnes Zeichen einlesen 285

Funktionstasten abfragen 287

Here-Dokument 273

Inline-Eingabeumleitung 273

Passworteingabe 293

Pfeiltasten abfragen 287

read 268

Tastendruck abfragen 285

umlenken mit exec 294

elif 191

else 189

Endlosschleifen 247

ENV 148, 381, 385

env 626

ERRNO 158

error_log 697

ERR-Signal 411

Ersatzmuster 89

; 91

? 91

* 90

Brace Extension 94

Muster-Alternativen 95

Zeichenbereiche 91

Zeichenklassen 93

esac 219

Escape-Sequenzen 257, 780

EUID 158

eval 391

exec 294

exit 69, 330, 558

Exit-Status 70, 155

expand 543

Expansion 89

Expansionen 386

export 140

Exportieren

Funktionen 316

expr 105

Externe Kommandos 762

F

Fallunterscheidung (case) 218

false 238, 248

FCEDIT 148

fdformat 577

fdisk 577

Fehler-Logdateien analysieren 697

Fehlersuche 403, 408

DEBUG 411

Debug-Ausgabe 416

ERR 411

LINENO 413

Syntax überprüfen 416

Tools 417

tracen 409

Variablen überprüfen 415

fg 372, 564

fgrep 423, 436

fi 181

FIFO-Prinzip 305

FIGNORE 150

file 544

Filedeskriptoren 297, 303

Anwendungsgebiete 299

neuen Filedeskriptor verwenden 298

Standarddeskriptoren 297

find 545

finger 558

Fließkomma-Zahlen 111

fold 545

for 227

Arrays 234

Dateinamen-Substitution 229

do 227

done 227

Kommando-Substitution 231

mehrdimensionale Arrays 236

mit Schleifenzähler 234

Variablen-Interpolation 233

FPATH 148, 337

free 571

fsck 579

ftp 603

FUNCNAME 324

function 314

Funktionen 39, 313

alias 334

auflisten 320

Aufruf 314

Aufrufreihenfolge 318

4087.book Seite 809 Freitag, 4. März 2016 1:00 13

Page 53: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

810

Funktionen (Forts.)

autoload 337

Bibliothek 318

Definition 313

exit 330

exportieren 316

FUNCNAME 324

function 314

globale Variablen 330

Kommando-Substitution 327

local 333

lokale Variablen 329, 330

Name ermitteln 324

Parameterübergabe 322

return 326

Rückgabe mehrerer Werte 328

Rückgabewert 325

Typ bestimmen 319

Typ ermitteln 318

unalias 335

weitere aufrufen 320

Funktionstasten abfragen 287

G

gawk 466

Gerätedatei 56

Gerätename 56

Gerätesignale 339

getline 518

getopts 174

getty 251

glob_dot_filenames 152

Globbing 89

GLOBIGNORE 150

globstar 90

gnuplot 729

3D-Plots 752

Abstand der Ausgabe 747

Anwendungsgebiete 729

ausführen 730

Ausgabe 734

Batch-Betrieb 740

Batch-Datei 740

Beschriftung 743

echo 741

eigene Funktionen 735

Größe der Ausgabe 747

Here-Dokument 741

Linien 745

neu zeichnen 739

gnuplot (Forts.)

Offset für X-Achse 748

Parameter 732

plot 731

Plot laden 740

Plot speichern 739

Plot-Style festlegen 742

Punkte 745

replot 739

Samplerate verändern 748

Shellscript 741

splot 752

Textdaten interpretieren 736

Variablen 732, 735

Zeit-Daten 750

grep 423

egrep 435

Grundlagen 424

Optionen 432

Pipes 431

reguläre Ausdrücke 425

groupadd 559

groupdel 559

groupmod 559

GROUPS 150

groups 559

gsub 510

gunzip 590

gzip 590, 683

H

halt 600

head 546, 656

Heimverzeichnis 51

Here-Dokument 273

gnuplot 741

read 277

Hintergrundprozess 64, 359

$! 155

bg 372

fg 372

hervorholen 359

Job-Verwaltung 370

nohup 360

SIGHUP 360

histchars 152

HISTCMD 158

HISTCONTROL 150

HISTFILE 148

HISTFILESIZE 150

4087.book Seite 810 Freitag, 4. März 2016 1:00 13

Index

811

HISTIGNORE 151

history_control 152

HISTSIZE 148

Holdspace 438

HOME 147

Homebrew 43

host 612

HOSTFILE 151

HOSTNAME 151

hostname 608

hostname_completion_file 152

HOSTTYPE 158

I

id 559

if 181

elif 191

else 189

Kommandos testen 183

Kommandoverkettung 185

Pipes 185

ifconfig 608

IFS 147, 278

IGNOREEOF 151

index 511

info 623

init 687

init (Runlevel) 687

init-Scripts 686

Inline-Eingabeumleitung 273

INPUTRC 151

inputrc 385

Integer-Arithmetik 105, 107

J

jobs 370, 564

Job-Verwaltung 370

bg 372

fg 372

jobs 370

K

kill 344, 371, 564

killall 565

Kommando 38

adduser 561, 657

afio 584

Alias 38

Kommando (Forts.)

alias 334, 625

apropos 623

arp 603

at 563

auf mehreren Rechnern ausführen 666

awk 120, 465

badblocks 572

basename 396, 556

batch 563

bc 111, 625

bg 372, 564

Builtin 38, 319, 759

bunzip2 583

bzcat 535

bzip2 583

cal 598

cat 48, 536

cd 53, 557

cfdisk 572

chgrp 536

chmod 61, 538

chown 539

cksum 536

clear 620

cmp 539

comm 539

compress 584

cp 49, 540

cpio 584, 683

cron 374, 564

crypt 587

csplit 541

cut 115, 542

date 599

dd 286, 573

dd_rescue 575

df 570, 664

diff 542

diff3 543

dig 612

dircmp 557

dirname 396, 557

dmesg 600

dos2unix 543

Drucker- 602

du 570

dump 588

dumpe2fs 575

e2fsck 576

echo 46, 254, 631

4087.book Seite 811 Freitag, 4. März 2016 1:00 13

Page 54: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

812

Kommando (Forts.)

egrep 435

env 626

ereignisabhängige Ausführung 215

eval 391

exec 294

exit 69, 558

expand 543

export 140

expr 105

externes 762

fdformat 577

fdisk 577

fg 372, 564

fgrep 436

file 544

find 545

finger 558

fold 545

free 571

fsck 579

ftp 603

Funktionen 39

getopts 174

grep 423

groupadd 559

groupdel 559

groupmod 559

groups 559

gunzip 590

gzip 590, 683

halt 600

head 546, 656

host 612

hostname 608

id 559

ifconfig 608

info 623

jobs 370, 564

kill 344, 564

killall 565

last 560, 656

less 547

let 108, 197

ln 547

logname 560

logout 76, 558

ls 47, 548

mail 610, 683

mailx 610, 683

man 623

Kommando (Forts.)

md5 536

md5sum 536

mesg 619

mkdir 54, 557

mkfifo 305

mkfs 580

mknod 305

mkswap 580

more 548

mount 581

mt 591

mv 49, 548

netstat 611

newgrp 560

nice 357, 565

nl 548

nohup 360, 565

nslookup 612

od 549

pack 592

parted 582

passwd 560, 657

paste 117, 549

pcat 550

pgrep 567

ping 612

PostScript- 625

print 259

printenv 626

printf 259

Programme 39

prtvtoc 582

ps 74, 566

pstree 567

pwd 51, 558

rcp 613

read 268, 388

reboot 600

renice 357, 567

reset 620

restore 588

return 326

rgrep 436

r-Kommandos 613

rlogin 613

rm 50, 550

rmdir 55, 558

rsh 613

rsync 616, 680

rwho 613

4087.book Seite 812 Freitag, 4. März 2016 1:00 13

Index

813

Kommando (Forts.)

scp 615

sed 120

select 307

set 170

setterm 620

Shellscript 39

shift 166

shutdown 600

sleep 567

sort 550

split 551

ssh 614, 666, 673

ssh-keygen 615

stty 286, 621

su 568

sudo 568

sum 536

swap 571

swapoff 582

swapon 582

sync 583

tac 552

tail 552

tar 592, 673

tee 87, 553

test 193

time 400, 569

top 74, 569

touch 50, 553

tput 263, 622

tr 118, 553

traceroute 618

trap 344

tty 375, 622

type 318, 554

typeset 109, 145, 401

ufsdump 588

ufsrestore 588

ulimit 398

umask 397, 554

umount 581

unalias 335, 625

uname 599

uncompress 584

uniq 554

unix2dos 555

unpack 592

unset 104

unzip 596

uptime 599

Kommando (Forts.)

useradd 561, 657

userdel 561

usermod 561

uudecode 555

uuencode 555, 683

wait 358

wall 619

wc 48, 555

whatis 624

whereis 556

who 45, 562

whoami 45, 562

write 619

xargs 394

zcat 556

zip 596

zless 556

zmore 556

Kommandoersetzung 130

Kommando-Substitution 127, 130, 231

erweiterte Syntax 132

Funktionen 327

Kommandozeilenparameter setzen 171

Kommandoverkettung 185

Kommandozeile 33

Autovervollständigung 775

Crashkurs 45

editieren 773

Kommandozeilenoptionen

auswerten 174

getopts 174

Kommandozeilenparameter 161

Anzahl überprüfen 196

setzen 170

über $9 168

verschieben 166

Vorgabewerte setzen 176

Kommentare 67

Konstante 104, 406

Kontrollstrukturen 181

bedingte Anweisung 181

case 218

elif 191

else 189

for 227

if 181

Kommandos testen 183

Schleifen 226

Sprünge 243

until 241

4087.book Seite 813 Freitag, 4. März 2016 1:00 13

Page 55: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

814

Kontrollstrukturen (Forts.)

while 237

while, assoziative Arrays 238

Kontrolltasten 775

Konvertierungen 114

Korn-Shell 40

ksh 40

kshrc 381, 383, 385

L

LANG 149

last 560, 656

LC_ALL 149

LC_COLLATE 149

LC_CTYPE 149

LC_MESSAGES 149

length 512

less 547

let 108, 197

Limits

ermitteln 398

setzen 398

LINENO 157, 413

LINES 149

ln 547

local 333

Logdateien analysieren 694

Login-Shell 76

Logische Ausdrücke 213

Logische Fehler 407

Logische Verknüpfung 209

LOGNAME 147

logname 560

logout 76, 558

ls 47, 548

M

MACHTYPE 151

MAIL 147

mail 610, 683

MAILCHECK 147

MAILPATH 147

MAILTO 378

mailx 610, 683

man 623

MANPATH 147

match 512

Mathematische Funktionen 111

md5 536

md5sum 536

Menüs (select) 307

mesg 619

mingetty 252

mkdir 54, 557

mkfifo 305

mkfs 580

mknod 305

mkswap 580

more 548

mount 581

mt 591

Muster-Alternativen 95

mv 49, 548

N

Named Pipe 304, 367

nawk 466

Negationsoperator 210

netstat 611

newgrp 560

nice 357, 565

nl 548

NLSPATH 149

no_exit_on_failed_exec 152

noclobber 152

nohup 360, 565

nolinks 153

notify 153

nslookup 612

O

oawk 466

od 549

ODER-Operator 209

|| 210

-o 209

ODER-Verknüpfung 212

OLDPWD 157

Operator

arithmetisch 110

logische 209

Negation 210

OPTARG 157

OPTERR 151

OPTIND 157

OSTYPE 158

4087.book Seite 814 Freitag, 4. März 2016 1:00 13

Index

815

P

pack 592

Parameter 161

parted 582

passwd 560, 657

Passworteingabe 293

paste 117, 549

PATH 147

Patternspace 438

sed 437

pcat 550

pdksh 40

Perl 37

pgrep 567

PID 74

ping 612

Pipes 85

grep 431

named 304, 367

PIPESTATUS auswerten 187, 188

zeilenweise einlesen 272

PIPESTATUS 151, 187

Plattenplatzbenutzung 646

Plotter (gnuplot) 729

Positionsparameter

verschieben 166

PostScript-Kommandos 625

PPID 157

print 259

printenv 626

printf 259

Profildaten 378

profile 380

Programm 38, 39

PROMPT_COMMAND 158

Prozess 74

Ausführzeit ermitteln 400

Daemon 74

Echtzeit 358

gestoppt 359

Hintergrundprozess 359

Job-Verwaltung 370

Kennung 74

nohup 360

Nummer 74

Priorität 357

Priorität erhöhen 358

Priorität verringern 358

Profildaten 378

ps 74

Prozess (Forts.)

Shellscript 74

Startprozess 378

Subshell 74, 361

Timesharing 357

top 74

Umgebungsvariablen 145

warten 358

Prozesse beenden

SIGKILL 653

SIGTERM 653

Prozesskennung 74

Prozessverwaltung 648

prtvtoc 582

ps 74, 566

PS1 147

PS2 147

PS3 149

PS4 72, 149

pstree 567

pts 252

PWD 157

pwd 51, 558

Q

Quantifizierer 421

Quoting 127

Back Quotes 130

Double Quotes 127

Leerzeichen 128

Single Quotes 127

Zeilenumbruch 128

R

RANDOM 157

rbash 41

rcp 613

read 268, 388

Arrays einlesen 283

Ausgabetext vorgeben 285

Datei zeilenweise einlesen 270

Default-Variable 285

Here-Dokument 277

Optionen 269

Pipes 272

REPLY 285

systemabhängiges 285

Taste abfragen 287

readonly 104

4087.book Seite 815 Freitag, 4. März 2016 1:00 13

Page 56: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

816

reboot 600

Rechnen 105

Fließkomma-Zahlen 111

mathematische Funktionen 111

Regular Expressions � Reguläre Ausdrücke

Reguläre Ausdrücke 419, 458

^ 422

? 423

. (Punkt) 420, 423

* 423

+ 423

< 422

> 422

$ 422

Alternativen 422

awk 483

B 422

b 422

beliebiges Zeichen 420

D 423

d 422

eckige Klammern 420

Einführung 419

Elemente (POSIX) 420

grep 425

Gruppierung 422

Quantifizierer 421

S 423

s 423

sed 445

Sonderzeichen 422

Zeichenauswahl 420

Zeichenklassen 421

Zeichenliterale 420

Remote Shell 44

renice 357, 567

REPLY 157, 285

reset 620

restore 588

Restrict Shell 41

return 326

rgrep 424, 436

r-Kommandos 613

rlogin 613

rm 50, 550

rmdir 55, 558

rsh 44, 613

rsync 616, 680

Rückgabewert 326

Runlevel 687

rwho 613

rzsh 41

S

Scheduling-Algorithmus 357

Schleifen 226

abbrechen mit Signalen 350

break 246

continue 244

Endlosschleifen 247

for 227

Sprünge 243

until 241

while 237

scp 615

SECONDS 157

Secure Shell 44

sed 120, 437

Adressen 441

a-Kommando 447

arbeiten mit Puffern 449

Ausgabe 439, 451

beenden 453

c-Kommando 448

Dateien 440

d-Kommando 449

Flags 444

g-Flag 455

G-Kommando 449

g-Kommando 449

globale Ersetzung 455

Grundlagen 437

H-Kommando 449

h-Kommando 449

Holdspace 438, 449

i-Kommando 451

Kommandos 443

Optionen 445

Patternspace 438, 449

p-Kommando 451

Probleme 458

Puffer 437, 449

q-Kommando 453

reguläre Ausdrücke 445, 458

r-Kommando 453

schreiben 439

Scripts 460

s-Kommando 454

suchen und ersetzen 454

Syntax 438

4087.book Seite 816 Freitag, 4. März 2016 1:00 13

Index

817

sed (Forts.)

Versionen 437

w-Kommando 453

x-Kommando 449

y-Kommando 459

Zeichen ersetzen 459

Zeilen einfügen 447, 451

Zeilen ersetzen 448

Zeilen löschen 449

select 307

do 307

done 307

PS3 309

REPLY 307

set 170, 320

-u 415

-x 409

setterm 620

sh 40

SHACCT 147

Shebang-Zeile 65

SHELL 148

Shell 32

Alias 38

Builtin 38

Builtin-Befehle 759

externe Kommandos 762

festlegen 64

Funktionen 39

History 34

Initialisierungsdateien 776

Kommandozeile editieren 773

Login-Shell 76

Optionen 763

Profildaten 378

Signale 778

Sonderzeichen 780

Startprozess 378

Subshell 64, 361

Tastaturkürzel 775

Variablen 765

Zeichenklassen 781

Shell-Optionen 763

SHELLOPTS 151

Shellscript 38, 39

andere Programmiersprachen 36

ausführen 59, 61, 143

ausführen ohne Subshell 143

Ausführrecht setzen 61

awk 471

beenden 69

Shellscript (Forts.)

beenden mit Signalen 351

Datenrückgabe an Scripts 365

Datenübergabe zwischen Scripts 363

debuggen 71, 403

erstellen 59

Exit-Status 70

Expansionen 386

Fehlerarten 407

Fehlersuche 403

Funktionen 313

gnuplot verwenden 741

Hintergrundprozess 64

Kommandofehler 408

Kommandos 386

Kommentare 67

Kommunikation zwischen Scripts 363

koordinieren 363

logische Fehler 407

Name 60

Named Pipe 367

ohne Subshell starten 67

optimieren 387

planen 403

Programmierstil 404

Prozess 74

Scripts synchronisieren 368

sed 460

Subshell 74

Syntaxfehler 407

Syntaxüberprüfung 386

testen 404

Vorgänge bei Ausführung 385

Was ist ein ... 35

Wozu ... 36

zeitgesteuert ausführen 373

Shellvariablen 153, 765

IFS 278

Umgebungsvariablen 146

Shell-Varianten 40

shift 166

SHLVL 158

Short Circuit Test 215

shutdown 600

SIGINT 248

SIGKILL 344

Signale 339, 778

abfangen 344

Beendigung abfangen 351

benutzerdefiniert 339

DEBUG 411

4087.book Seite 817 Freitag, 4. März 2016 1:00 13

Page 57: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

818

Signale (Forts.)

ERR 411

EXIT abfangen 351

Gerätesignale 339

ignorieren 340, 353

kill 344

Script beenden 351

Scripts synchronisieren 368

senden 344

SIGABRT 341, 778

SIGALRM 342, 779

SIGBUS 341, 778

SIGCHLD 342, 779

SIGCLD 343, 779

SIGCONT 342, 371, 779

SIGEMT 341, 778

SIGFPE 341, 778

SIGHUP 341, 360, 778

SIGILL 341, 778

SIGINT 341, 778

SIGIO 342, 779

SIGIOT 341, 778

SIGKILL 342, 344, 653, 778

SIGLOST 343, 780

Signalhandler einrichten 347

SIGPIPE 343, 780

SIGPOLL 342, 779

SIGPROF 342, 779

SIGQUIT 341, 778

SIGSEGV 341, 778

SIGSTOP 342, 371, 779

SIGSYS 341, 778

SIGTERM 342, 344, 653, 778

SIGTRAP 341, 778

SIGTSTP 343, 779

SIGTTIN 343, 779

SIGTTOU 343, 779

SIGURG 342, 779

SIGUSR1 343, 780

SIGUSR2 343, 780

SIGVTALRM 342, 779

SIGWINCH 343, 780

SIGXCPU 343, 780

SIGXFSZ 343, 780

Standardaktion 339

Systemsignale 339

trap 344

Übersicht 341

zurücksetzen 354

SIGSTOP 371

SIGTERM 344

Single Quotes 127

sleep 567

Sonderzeichen 780

sort 550

split 513, 551

sprintf 513

ssh 44, 614, 666, 673

ssh-keygen 615

Standardausgabe 77

umleiten 78

Standardeingabe 77

umleiten 82

Standardfehlerausgabe 77

umleiten 79

Startprozess 378

Startup-Scripts 686

stderr 77

stdin 77

stdout 77

Steuerzeichen 255

Stream-Editor 437

strftime 514

Stringfunktionen 510

Strings 115

abschneiden 124

aneinanderreihen 123

Groß- und Kleinschreibung 126

Länge ermitteln 122

Teile entfernen 123, 125

übersetzen 118

vergleichen 198

zusammenfügen 117

zuschneiden 115

stty 286, 287, 621

echo 293

raw 286

su 568

sub 510

Subshell 64, 361

Prozess 74

Variablen der Elternshell 141

substr 513

sudo 568

sum 536

swap 571

swapoff 582

swapon 582

sync 583

Synchronisieren 368, 680

Syntaxfehler 407

Syntaxüberprüfung 386

4087.book Seite 818 Freitag, 4. März 2016 1:00 13

Index

819

Systemadministration 645

access_log 694

Backup 670

Benutzerverwaltung 646, 657

CGI-Scripts 700

Fehler-Logdateien analysieren 697

HTML 693

init-Scripts 686

Logdateien analysieren 694

Plattenplatzbenutzung 646

Prozesse beenden 653

Prozessverwaltung 648

Startup-Scripts 686

synchronisieren 680

Sys-V-Init-Scripts 686

Überwachung 655

World Wide Web 693

Systemsignale 339

Systemzugang 33

systime 514

Sys-V-Init-Scripts 686

T

tac 552

tail 552

tar 592, 673

Tastaturkürzel 775

Tastendruck abfragen 285

tcsh 42

TC-Shell 42

tee 87, 553

TERM 148

Terminal 251

Ausgabe 251, 253

Bildschirm löschen 263

Cursor steuern 267

Eingabe 251, 268

Escape-Sequenzen 255

Farbe verändern 266

Informationen ermitteln 263

Pseudo- 251

pts 252

Steuerung 263

Steuerzeichen 255

Textattribute verändern 264

tput 263

ttyp 252

terminfo 263

test 193

!= 198

test (Forts.)

< 203

= 198

== 203

> 203

-0 206

-a 209, 211

-b 206

-c 206

-d 206

Dateistatus ermitteln 205

Dateityp ermitteln 206

-e 207

-ef 207

-eq 194

Existenz überprüfen 207

-f 206

-G 206

-g 206

-ge 194

-gt 194

-h 206

-k 206

-L 206

-le 194

logische Operatoren 209

-lt 194

-n 198

-ne 194

-nt 207

-o 209, 212

-ot 207

-p 206

-r 206

-S 206

-s 207

-t 206

-u 206

-w 206

-x 206

-z 198

Zahlen vergleichen 194

Zeichenketten vergleichen 198

Zeitstempel vergleichen 207

Zugriffsrechte ermitteln 206

then 181

Tilde-Expansion 95

time 400, 569

TIMEFORMAT 151

Timesharing-Prozesse 357

Tischrechner 111

4087.book Seite 819 Freitag, 4. März 2016 1:00 13

Page 58: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Index

820

TMOUT 149

top 74, 569

touch 50, 553

tput 263, 622

blink 264

bold 264

boldoff 264

clear 267

colors 264

cols 264

cup 267

dch1 267

dl1 267

Farben verändern 266

home 267

il1 267

Informationen 263

lines 264

pairs 264

rev 265

rmu1 265

sgr0 265

smu1 265

Terminal steuern 267

Textattribute verändern 264

tr 118, 553

traceroute 618

trap 344

Trennungszeichen

IFS 278

true 238, 248

tty 375, 622

ttyp 252

type 318, 554

typeset 109, 401

-F 320

-f 320

Optionen 401

Variablen exportieren 145

TZ 148

U

ufsdump 588

ufsrestore 588

UID 158

ulimit 398

umask 397, 554

Umgebungsvariablen 145

IFS 278

LINENO 72

Umgebungsvariablen (Forts.)

PS4 72

Shellvariablen 146

umount 581

unalias 335, 625

uname 599

uncompress 584

UND-Operator 209

&& 210

-a 209

UND-Verknüpfung 211

ungarische Notation 405

Unicodes 139

uniq 554

unix2dos 555

UNIX-Timestamp 514

unpack 592

unset 104

until 241

do 241

done 241

unzip 596

uptime 599

useradd 657

userdel 561

usermod 561

uudecode 555

uuencode 555, 683

V

Variablen 99

$! 155

$? 155

$@ 164

$* 163

$# 165

$$ 154

$0 153

$1 .. $9 161

arithmetische Ausdrücke 108

Array 132

automatische Shellvariablen 153

awk 488

definieren 99

exportieren 140

exportieren mit typeset 145

global 330

IFS 278

Integer 105

Integer-Arithmetik 107

4087.book Seite 820 Freitag, 4. März 2016 1:00 13

Index

821

Variablen (Forts.)

Interpolation 100

Kommandozeilenparameter 161

Konstante 104

local 333

lokal 329, 330

löschen 104

Namen 406

Namen abgrenzen 102

Shell- 765

Strings 115

Stringverarbeitung 115

typeset 109

überprüfen 415

undefiniert 102

vererben an (Sub-)Subshell 141

vererben an Subshell 141

Vorgabewerte setzen 176

Zahlen 105

Zahlen konvertieren 114

Zahlen vergleichen 194

Zeichenkette 115

Zugriff 99

Variablen-Interpolation 233

Versteckte Dateien 93

Verzeichnisname 55

Verzeichnisse 51

. 52

.. 52

absolute Pfadangabe 51

Arbeitsverzeichnis ermitteln 51

erstellen 54

Grundlagen 51

Hierarchien 51

Home 51

löschen 55

Namen 55

relative Pfadangabe 52

vollständige Pfadangabe 51

wechseln 53

Wurzelverzeichnis 51

Zugriffsrechte 57

VISUAL 149

W

wait 358

wall 619

wc 48, 555

Webserver (Logdateien analysieren) 694

whatis 624

whereis 556

while 237

do 238

done 238

who 45, 562

whoami 46, 562

Wildcards 89

write 619

X

xargs 394

Xdialog 715

Z

Zahlen konvertieren 114

Zahlen vergleichen 194

let 197

zcat 556

Zeichenauswahl 420

Zeichenketten 115

abschneiden 124

aneinanderreihen 123

awk-Funktionen 121

Groß- und Kleinschreibung 126

Länge ermitteln 122

Teile entfernen 123, 125

übersetzen 118

vergleichen 198

zusammenfügen 117

zuschneiden 115

Zeichenketten vergleichen

Bash 203

Korn-Shell 203

Zeichenkettenerweiterung 258

Zeichenkettenfunktionen 510

Zeichenkettenvergleiche 480

Zeichenklassen 421, 781

Zeichenliterale 420

Zeitfunktionen 514

zgrep 556

zip 596

zless 556

zmore 556

zsh 41

Z-Shell 41

Zugriffsrechte 57

ermitteln 206

4087.book Seite 821 Freitag, 4. März 2016 1:00 13

Page 59: Shell-Programmierung – Das umfassende Handbuch · PDF filegenden Kommandos wie zum Beispiel cp , pwd , ls ... die au ch in den meisten ... Für einen Systemadministrator von Linux/UNIX-Sys-4087.book

Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Sie dürfen sie gerne empfehlen und weitergeben, allerdings nur vollständig mit allen Seiten. Bitte beachten Sie, dass der Funktionsumfang dieser Leseprobe sowie ihre Darstel- lung von der E-Book-Fassung des vorgestellten Buches abweichen können. Diese Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nut- zungs- und Verwertungsrechte liegen beim Autor und beim Verlag.

Teilen Sie Ihre Leseerfahrung mit uns!

Jürgen Wolf ist Softwareentwickler und Autor aus Leiden-schaft, er programmiert seit Jahren auf Linux- und UNIX- Systemen. Aus seiner Feder stammen vielbeachtete Titel zu C/C++ und zur Linux- sowie Shell-Programmierung.

Stefan Kania, Jahrgang 1961, ist ausgebildeter Informatiker und seit 1997 freiberuflich als Consultant und Trainer tätig. Seine Schwerpunkte liegen in der Implementierung von Samba und LDAP sowie in Schulungen zu beiden Themen. In seiner übrigen Zeit ist er als Tauchlehrer tätig, läuft Mara-thon und seit einiger Zeit versucht er sich am Square Dance. Mit dem Motorrad und seiner großen Liebe erkundet er im Sommer seine neue Wahlheimat Schleswig-Holstein.

Jürgen Wolf, Stefan Kania

Shell-Programmierung – Das umfassende Handbuch821 Seiten, gebunden, 5. Auflage 2016 39,90 Euro, ISBN 978-3-8362-4087-1

www.rheinwerk-verlag.de/4093

Wissen, wie’s geht.