Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Jürgen Wolf
Shell-Programmierung
1650.book Seite 1 Dienstag, 8. Juni 2010 1:40 13
Auf einen Blick
1 Einführung .......................................................................... 29
2 Variablen ............................................................................. 97
3 Parameter und Argumente ................................................. 153
4 Kontrollstrukturen .............................................................. 173
5 Terminal-Ein- und Ausgabe ................................................ 239
6 Funktionen .......................................................................... 335
7 Signale ................................................................................ 361
8 Rund um die Ausführung von Scripts und Prozessen ......... 377
9 Nützliche Funktionen ......................................................... 411
10 Fehlersuche und Debugging ............................................... 423
11 Reguläre Ausdrücke und grep ............................................. 439
12 Der Stream-Editor sed ........................................................ 457
13 awk-Programmierung ......................................................... 485
14 Linux-UNIX-Kommandoreferenz ........................................ 545
15 Die Praxis ............................................................................ 647
16 GUIs mit Tcl/Tk ................................................................... 727
1650.book Seite 3 Dienstag, 8. Juni 2010 1:40 13
5
Inhalt
Vorwort des Autors .................................................................................... 23
Vorwort des Gutachters – die Shell: Fluch oder Segen? ............................... 27
Als Autor eines Fachbuchs steht man am Anfang immer vor der Frage, wo man anfangen 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 angeboten wird. 29
1 Einführung .............................................................................. 29
1.1 Voraussetzungen an den Leser ................................................... 291.1.1 Zielgruppe .................................................................. 301.1.2 Notation ..................................................................... 31
1.2 Was ist eine Shell? ..................................................................... 331.3 Hauptanwendungsgebiet ........................................................... 35
1.3.1 Was ist ein Shellscript? ................................................ 361.3.2 Vergleich mit anderen Sprachen .................................. 37
1.4 Kommando, Programm oder Shellscript? ................................... 391.4.1 Shell-eigene Kommandos (Builtin-Kommando) ............ 391.4.2 Aliase in der Shell ....................................................... 391.4.3 Funktionen in der Shell ............................................... 401.4.4 Shellscripts (Shell-Prozeduren) .................................... 401.4.5 Programme (binär) ...................................................... 40
1.5 Die Shell-Vielfalt ........................................................................ 401.5.1 ksh (Korn-Shell) .......................................................... 411.5.2 Bash (Bourne-Again-Shell) .......................................... 411.5.3 zsh (Z-Shell) ................................................................ 421.5.4 ash (A-Shell) ............................................................... 421.5.5 rbash, rzsh (Restricted Shell) ....................................... 421.5.6 tcsh (TC-Shell) ............................................................. 421.5.7 Welche Shell-Variante wird in diesem Buch
verwendet? ................................................................. 431.5.8 rsh und ssh ................................................................. 44
1.6 Betriebssysteme ......................................................................... 441.7 Crashkurs: einfacher Umgang mit der Kommandozeile ............... 45
1.7.1 Grundlegende Befehle ................................................. 451.7.2 Der Umgang mit Dateien ............................................ 471.7.3 Der Umgang mit Verzeichnissen .................................. 501.7.4 Datei- und Verzeichnisnamen ..................................... 541.7.5 Gerätenamen .............................................................. 551.7.6 Dateiattribute ............................................................. 55
1650.book Seite 5 Dienstag, 8. Juni 2010 1:40 13
Inhalt
6
1.8 Shellscripts schreiben und ausführen .......................................... 581.8.1 Der Editor ................................................................... 581.8.2 Der Name des Shellscripts ........................................... 591.8.3 Ausführen ................................................................... 591.8.4 Hintergrundprozess starten ......................................... 631.8.5 Ausführende Shell festlegen ........................................ 631.8.6 Kommentare ............................................................... 661.8.7 Stil .............................................................................. 671.8.8 Ein Shellscript beenden ............................................... 681.8.9 Testen und Debuggen von Shellscripts ........................ 701.8.10 Shellscript, das ein Shellscript erstellt und ausführt ...... 71
1.9 Vom Shellscript zum Prozess ...................................................... 731.9.1 Ist das Shellscript ein Prozess? ..................................... 741.9.2 Echte Login-Shell? ...................................................... 75
1.10 Datenstrom ............................................................................... 761.10.1 Ausgabe umleiten ....................................................... 771.10.2 Standardfehlerausgabe umleiten ................................. 791.10.3 Eingabe umleiten ........................................................ 821.10.4 Pipes ........................................................................... 851.10.5 Ein T-Stück mit tee ..................................................... 861.10.6 Ersatzmuster (Wildcards) ............................................. 871.10.7 Brace Extension (Bash und Korn-Shell only) ................ 921.10.8 Muster-Alternativen (Bash und Korn-Shell only)........... 931.10.9 Tilde-Expansion (Bash und Korn-Shell only) ................ 94
1.11 Empfehlung ............................................................................... 95
Keine Programmiersprache kommt ohne Variablen aus. Variablen werden gewöhnlich dazu verwendet, Daten (Zahlen oder Zeichenketten) zu speichern, um zu einem späteren Zeitpunkt wieder darauf zurückzugreifen. Allerdings finden Sie bei der Shellscript-Programmierung im Vergleich zu vielen anderen Programmiersprachen zunächst keine speziellen Datentypen, bspw.für Zeichenketten, Fließkomma- oder Integerzahlen. 97
2 Variablen ................................................................................ 97
2.1 Grundlagen ................................................................................ 972.1.1 Zugriff auf den Wert einer Variablen ........................... 972.1.2 Variablen-Interpolation ............................................... 98
2.2 Zahlen ....................................................................................... 1022.2.1 Integer-Arithmetik (Bourne-Shell, Bash und
Korn-Shell) ................................................................. 1032.2.2 Integer-Arithmetik (Bash und Korn-Shell only) ............. 1052.2.3 bc – Rechnen mit Fließkommazahlen und
mathematische Funktionen ......................................... 1082.3 Zeichenketten ............................................................................ 111
2.3.1 Stringverarbeitung ...................................................... 1122.3.2 Erweiterte Funktionen für Bash und Korn-Shell ............ 119
2.4 Quotings und Kommando-Substitution ...................................... 122
1650.book Seite 6 Dienstag, 8. Juni 2010 1:40 13
Inhalt
7
2.4.1 Single und Double Quotings ....................................... 1232.4.2 Kommando-Substitution – Back Quotes ...................... 125
2.5 Arrays (Bash und Korn-Shell only) .............................................. 1282.5.1 Werte an Arrays zuweisen ........................................... 1292.5.2 Eine Liste von Werten an ein Array zuweisen
(Bash) ......................................................................... 1302.5.3 Eine Liste von Werten an ein Array zuweisen
(Korn-Shell) ................................................................ 1302.5.4 Zugreifen auf die einzelnen Elemente eines Arrays ....... 131
2.6 Variablen exportieren ................................................................ 1342.7 Umgebungsvariablen eines Prozesses ......................................... 1402.8 Shell-Variablen .......................................................................... 1412.9 Automatische Variablen der Shell .............................................. 146
2.9.1 Der Name des Shellscripts – $0 ................................... 1462.9.2 Die Prozessnummer des Shellscripts – $$ .................... 1472.9.3 Der Beendigungsstatus eines Shellscripts – $? .............. 1482.9.4 Die Prozessnummer des zuletzt gestarteten
Hintergrundprozesses – $! ........................................... 1482.9.5 Weitere vordefinierte Variablen der Shell .................... 1492.9.6 Weitere automatische Variablen für Bash
und Korn-Shell ............................................................ 149
Nachdem Sie sich mit der Ausführung von Shellscripts und den Variablen vertraut machen konnten, folgt in diesem Kapitel die Übergabe von Argumenten an ein Shellscript. Damit wird Ihr Shellscript wesentlich flexibler und vielseitiger. 153
3 Parameter und Argumente ..................................................... 153
3.1 Einführung ................................................................................. 1533.2 Kommandozeilenparameter $1 bis $9 ........................................ 1533.3 Besondere Parameter ................................................................. 154
3.3.1 Die Variable $* ........................................................... 1553.3.2 Die Variable $@ ......................................................... 1573.3.3 Die Variable $# ........................................................... 157
3.4 Der Befehl »shift« ...................................................................... 1583.5 Argumente und Leerzeichen ...................................................... 1603.6 Argumente jenseits von $9 ........................................................ 1613.7 Argumente setzen mit set und Kommando-Substitution ............ 1623.8 getopts – Kommandozeilenoptionen auswerten ......................... 1663.9 Vorgabewerte für Variablen ....................................................... 169
Um aus der »Shell« eine »echte« Programmiersprache zu machen, sind so genannte Kontrollstrukturen erforderlich. Dabei handelt es sich um Entscheidungsverzweigungen oder Schleifen. Eine Programmiersprache ohne Verzweigungen wäre wohl eine Katastrophe. Mit einer Verzweigung können Sie dafür sorgen, dass die weitere Ausführung des Scripts von einer bestimmtenBedingung abhängt und eben entsprechend verzweigt wird. Ebenso sieht es mit den Schleifen aus. Anstatt immer Zeile für Zeile dieselben Anweisungen auszuführen, können Sie diese auch in einer Schleife zusammenfassen. 173
4 Kontrollstrukturen ................................................................. 173
4.1 Bedingte Anweisung mit if ......................................................... 1734.1.1 Kommandos testen mit if ............................................ 1754.1.2 Kommandoverkettung über Pipes mit if ...................... 178
1650.book Seite 7 Dienstag, 8. Juni 2010 1:40 13
Inhalt
8
4.2 Die else-Alternative für eine if-Verzweigung .............................. 1814.3 Mehrfache Alternative mit elif ................................................... 1834.4 Das Kommando »test« ............................................................... 186
4.4.1 Ganze Zahlen vergleichen ........................................... 1874.4.2 Ganze Zahlen vergleichen mit let (Bash und
Korn-Shell only) .......................................................... 1894.4.3 Zeichenketten vergleichen .......................................... 1904.4.4 Zeichenketten vergleichen (Bash und
Korn-Shell only) .......................................................... 1954.5 Status von Dateien erfragen ....................................................... 1974.6 Logische Verknüpfung von Ausdrücken ..................................... 201
4.6.1 Negationsoperator ! .................................................... 2014.6.2 Die UND-Verknüpfung (-a und &&) ............................ 2024.6.3 Die ODER-Verknüpfung (-o und ||) ............................ 2044.6.4 Klammerung und mehrere logische Verknüpfungen ..... 205
4.7 Short Circuit-Tests – ergebnisabhängige Befehlsausführung ........ 2074.8 Die Anweisung case ................................................................... 210
4.8.1 Alternative Vergleichsmuster ....................................... 2124.8.2 case und Wildcards ..................................................... 2144.8.3 case und Optionen ...................................................... 216
4.9 Schleifen .................................................................................... 2174.10 for-Schleife ................................................................................ 217
4.10.1 Argumente bearbeiten mit for ..................................... 2184.10.2 for und die Dateinamen-Substitution .......................... 2194.10.3 for und die Kommando-Substitution ........................... 2214.10.4 for und Array (Bash und Korn Shell only) ..................... 2244.10.5 for-Schleife mit Schleifenzähler (Bash only) ................. 225
4.11 Die while-Schleife ...................................................................... 2274.12 Die until-Schleife ....................................................................... 2294.13 Kontrollierte Sprünge ................................................................ 232
4.13.1 Der Befehl »continue« ................................................. 2334.13.2 Der Befehl »break« ...................................................... 234
4.14 Endlosschleifen .......................................................................... 236
Bisher wurde die Ausgabe auf dem Bildschirm immer verwendet, ohne dass jemals näher darauf eingegangen wurde. Zur perfekten Interaktion gehört neben der Bildschirmausgabe die Benutzereingabe. In diesem Kapitel werden Sie alles Nötige zur Ein- und Ausgabe erfahren. Außerdem soll der Begriff »Terminal« ein wenig genauer erläutert werden. 239
5 Terminal-Ein- und Ausgabe .................................................... 239
5.1 Von Terminals zu Pseudo-Terminals ........................................... 2395.2 Ausgabe .................................................................................... 242
5.2.1 Der echo-Befehl .......................................................... 2425.2.2 print (Korn-Shell only) ................................................ 2465.2.3 Der Befehl »printf« ...................................................... 246
1650.book Seite 8 Dienstag, 8. Juni 2010 1:40 13
Inhalt
9
5.2.4 Der Befehl »tput« – Terminalsteuerung ........................ 2505.3 Eingabe ..................................................................................... 255
5.3.1 Der Befehl »read« ........................................................ 2555.3.2 (Zeilenweise) Lesen einer Datei mit read ..................... 2575.3.3 Zeilenweise mit einer Pipe aus einem Kommando
lesen (read) ................................................................. 2585.3.4 Here-Dokumente (Inline-Eingabeumleitung) ................ 2595.3.5 Here-Dokumente mit read verwenden ........................ 2625.3.6 Die Variable IFS .......................................................... 2635.3.7 Arrays einlesen mit read (Bash und Korn-Shell only)..... 2695.3.8 Shell-abhängige Anmerkungen zu read ....................... 2705.3.9 Einzelnes Zeichen abfragen ......................................... 2715.3.10 Einzelne Zeichen mit Escape-Sequenzen abfragen ........ 2725.3.11 Passworteingabe ......................................................... 279
5.4 Umlenken mit dem Befehl »exec« .............................................. 2795.5 Filedeskriptoren ......................................................................... 282
5.5.1 Einen neuen Filedeskriptor verwenden ........................ 2845.5.2 Die Umlenkung <> ...................................................... 287
5.6 Named Pipes ............................................................................. 2885.7 Menüs mit select (Bash und Korn-Shell only) ............................. 2905.8 dialog und Xdialog .................................................................... 295
5.8.1 Entscheidungsfrage --yesno ......................................... 2965.8.2 Nachrichtenbox mit Bestätigung --msgbox .................. 2985.8.3 Hinweisfenster ohne Bestätigung --infobox ................. 2995.8.4 Text-Eingabezeile --inputbox ...................................... 2995.8.5 Ein einfacher Dateibetrachter --textbox ....................... 3005.8.6 Ein Menü --menu ....................................................... 3015.8.7 Auswahlliste zum Ankreuzen --checklist ...................... 3025.8.8 Radiobuttons zum Auswählen --radiolist ..................... 3035.8.9 Fortschrittszustand anzeigen --gauge .......................... 3045.8.10 Verändern von Aussehen und Ausgabe ....................... 3065.8.11 Kleines Beispiel ........................................................... 3065.8.12 Zusammenfassung ....................................................... 307
5.9 gnuplot – Visualisierung von Messdaten .................................... 3085.9.1 Wozu wird gnuplot eingesetzt? ................................... 3095.9.2 gnuplot starten ........................................................... 3095.9.3 Das Kommando zum Plotten ...................................... 3105.9.4 Variablen und Parameter für gnuplot .......................... 3115.9.5 Ausgabe von gnuplot umleiten ................................... 3135.9.6 Variablen und eigene Funktionen definieren ................ 3145.9.7 Interpretation von Daten aus einer Datei .................... 315
1650.book Seite 9 Dienstag, 8. Juni 2010 1:40 13
Inhalt
10
5.9.8 Alles bitte nochmals zeichnen (oder besser speichern und laden) .................................................. 318
5.9.9 gnuplot aus einem Shellscript heraus starten (der Batch-Betrieb) ..................................................... 319
5.9.10 Plot-Styles und andere Ausgaben festlegen ................. 3215.9.11 Tricks für die Achsen ................................................... 3275.9.12 Die dritte Dimension .................................................. 3325.9.13 Zusammenfassung ....................................................... 334
Je länger die Shellscripts in den vorangegangenen Kapiteln wurden, umso unübersichtlicher wurden sie. Verwendete man dann auch noch die Routinen mehrmals im Script, so steigerte sich der Umfang weiter. In solch einem Fall (und eigentlich fast immer) sind Funktionen die Lösung. Mit Funktionen fassen Sie mehrere Befehle in einem Block zwischen geschweiftenKlammern zusammen und rufen sie bei Bedarf mit einem von Ihnen definierten Funktionsnamen auf. Eine einmal definierte Funktion können Sie jederzeit in Ihrem Script mehrmals aufrufen und verwenden. Funktionen sind somit auch Scripts, welche in der laufenden Umgebung des Shell-Prozesses immer präsent sind, und verhalten sich folglich, als seien Sie interneShell-Kommandos. 335
6 Funktionen ............................................................................. 335
6.1 Definition .................................................................................. 3356.1.1 Definition (Bash und Korn-Shell only) ......................... 3366.1.2 Funktionsaufruf ........................................................... 3366.1.3 Funktionen exportieren ............................................... 3386.1.4 Aufrufreihenfolge ........................................................ 3406.1.5 Who is who ................................................................ 3406.1.6 Aufruf selbst bestimmen ............................................. 3416.1.7 Funktionen auflisten ................................................... 342
6.2 Funktionen, die Funktionen aufrufen ......................................... 3426.3 Parameterübergabe ................................................................... 3446.4 Rückgabewert aus einer Funktion .............................................. 347
6.4.1 Rückgabewert mit return ............................................ 3486.4.2 Rückgabewert mit echo und einer Kommando-
Substitution ................................................................ 3496.4.3 Rückgabewert ohne eine echte Rückgabe
(lokale Variable) .......................................................... 3516.4.4 Funktionen und exit .................................................... 352
6.5 Lokale contra globale Variablen ................................................. 3526.5.1 Lokale Variablen (Bash und Korn-Shell only) ................ 355
6.6 alias und unalias ........................................................................ 3566.7 Autoload (Korn-Shell only) ........................................................ 359
Signale werden zur Steuerung von Prozessen verwendet. Wie ein Prozess auf ein bestimmtes Signal reagiert, können Sie entweder dem System überlassen oder selbst festlegen. 361
7 Signale .................................................................................... 361
7.1 Grundlagen zu den Signalen ...................................................... 3617.2 Signale senden – kill .................................................................. 3657.3 Eine Fallgrube für Signale – trap ................................................. 366
7.3.1 Einen Signalhandler (Funktion) einrichten ................... 3697.3.2 Mit Signalen Schleifendurchläufe abbrechen ................ 3727.3.3 Mit Signalen das Script beenden ................................. 372
1650.book Seite 10 Dienstag, 8. Juni 2010 1:40 13
Inhalt
11
7.3.4 Das Beenden der Shell (oder eines Scripts) abfangen.... 3737.3.5 Signale ignorieren ....................................................... 3747.3.6 Signale zurücksetzen ................................................... 375
Es reicht einfach nicht aus, nur zu wissen, wie man ein Shellscript schreibt, man muss auch wissen, wie man ein Shellscript ausführen kann. Ein Script ausführen im herkömmlichen Sinn kann jeder – doch gibt es verschiedene Möglichkeiten, wie ein oder mehrere Scripts ausgeführt werden können. Viele der hier genannten Themen wurden zwar bereits das ein oder andereMal angesprochen, jedoch ohne ins Detail zu gehen. 377
8 Rund um die Ausführung von Scripts und Prozessen ............ 377
8.1 Prozessprioritäten ...................................................................... 3778.2 Warten auf andere Prozesse ....................................................... 3788.3 Hintergrundprozess wieder hervorholen .................................... 3798.4 Hintergrundprozess schützen ..................................................... 3808.5 Subshells ................................................................................... 3818.6 Mehrere Scripts verbinden und ausführen (Kommunikation
zwischen Scripts) ....................................................................... 3838.6.1 Datenübergabe zwischen Scripts ................................. 3838.6.2 Rückgabe von Daten an andere Scripts ....................... 3858.6.3 Scripts synchronisieren ................................................ 388
8.7 Jobverwaltung ........................................................................... 3908.8 Shellscripts zeitgesteuert ausführen ........................................... 3938.9 Startprozess- und Profildaten der Shell ...................................... 399
8.9.1 Arten von Initialisierungsdateien ................................. 3998.9.2 Ausführen von Profildateien beim Start einer
Login-Shell .................................................................. 4008.9.3 Ausführen von Profildateien beim Start einer
Nicht-Login-Shell (Bash und Korn-Shell) ..................... 4038.9.4 Zusammenfassung alle Profil- und Startup-Dateien ...... 405
8.10 Ein Shellscript bei der Ausführung ............................................. 4068.10.1 Syntaxüberprüfung ...................................................... 4078.10.2 Expansionen ............................................................... 4078.10.3 Kommandos ............................................................... 407
8.11 Shellscripts optimieren .............................................................. 409
Dieses Kapitel zeigt Ihnen einige sehr hilfreiche »Funktionen«, auf die bisher noch nicht eingegangen werden konnte. Natürlich stellt dies noch lange nicht den kompletten Funktionsumfang der Shell-Funktionen dar, weshalb Sie neben der Linux-UNIX-Kommandoreferenz (Kapitel 14) in diesem Buch im Anhang noch einen Überblick zu allen »Builtins« für die jeweiligeShell finden. 411
9 Nützliche Funktionen ............................................................. 411
9.1 Der Befehl »eval« ....................................................................... 4119.2 xargs .......................................................................................... 4149.3 dirname und basename ............................................................. 4169.4 umask ........................................................................................ 4179.5 ulimit (Builtin) ........................................................................... 4189.6 time .......................................................................................... 4209.7 typeset ...................................................................................... 421
1650.book Seite 11 Dienstag, 8. Juni 2010 1:40 13
Inhalt
12
Sicherlich haben Sie im Verlauf der vielen Kapitel beim Tippen und Schreiben von Scripts genauso viele Fehler gemacht wie ich und sich gefragt: Was passt denn jetzt wieder nicht? Auch hier gilt, dass Fehler beim Lernen nichts Schlechtes sind. Aber sobald Sie Ihre Scripts auf mehreren oder fremden Rechnern ausführen, sollte dies nicht mehr vorkommen. Daher findenSie in diesem Kapitel einige Hinweise, wie Sie Fehler vermeiden können und, wenn sie bereits aufgetreten sind, wie Sie diesen auf die Schliche kommen. 423
10 Fehlersuche und Debugging .................................................. 423
10.1 Strategien zum Vermeiden von Fehlern ...................................... 42310.1.1 Planen Sie Ihr Script .................................................... 42310.1.2 Testsystem bereitstellen .............................................. 42410.1.3 Ordnung ist das halbe Leben ....................................... 425
10.2 Fehlerarten ................................................................................ 42710.3 Fehlersuche ............................................................................... 428
10.3.1 Tracen mit set -x ......................................................... 42910.3.2 DEBUG und ERR-Signal ............................................... 43110.3.3 Variablen und Syntax überprüfen ................................ 43510.3.4 Eine Debug-Ausgabe hinzufügen ................................. 43610.3.5 Debugging-Tools ........................................................ 437
Die Verwendung von regulären Ausdrücken und grep ist Grundlage eines jeden Linux-UNIX-Anwenders. Und für einen Systemadministrator ist sie sowieso unerlässlich, denn es gibt kein vernünftiges System, in dem sie nicht vorkommen. Eine kurze Einführung zu den regulären Ausdrücken wie auch zum Tool grep (und seinen Nachkommen wie bspw. egrep und fgrep)erscheint daher notwendig. 439
11 Reguläre Ausdrücke und grep ................................................ 439
11.1 Reguläre Ausdrücke – die Theorie .............................................. 43911.1.1 Elemente für reguläre Ausdrücke (POSIX-RE) ............... 44011.1.2 Zusammenfassung ....................................................... 443
11.2 grep ........................................................................................... 44311.2.1 Wie arbeitet grep? ...................................................... 44411.2.2 grep mit regulären Ausdrücken ................................... 44511.2.3 grep mit Pipes ............................................................. 45011.2.4 grep mit Optionen ...................................................... 45111.2.5 egrep (extended grep) ................................................. 45411.2.6 fgrep (fixed oder fast grep) .......................................... 45511.2.7 rgrep ........................................................................... 456
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 Zeichenfolgen verwendet. 457
12 Der Stream-Editor sed ........................................................... 457
12.1 Funktions- und Anwendungsweise von sed ................................ 45712.1.1 Grundlegende Funktionsweise .................................... 45712.1.2 Wohin mit der Ausgabe? ............................................. 459
12.2 Der sed-Befehl ........................................................................... 46112.3 Adressen ................................................................................... 46212.4 Kommandos, Substitutionsflags und Optionen von sed .............. 464
12.4.1 Das a-Kommando – Zeile(n) anfügen .......................... 46712.4.2 Das c-Kommando – Zeilen ersetzen ............................ 46812.4.3 Das d-Kommando – Zeilen löschen ............................. 46912.4.4 Die Kommandos h, H, g, G und x – Arbeiten mit
den Puffern ................................................................. 469
1650.book Seite 12 Dienstag, 8. Juni 2010 1:40 13
Inhalt
13
12.4.5 Das Kommando i – Einfügen von Zeilen ...................... 47112.4.6 Das p-Kommando – Patternspace ausgeben ................ 47212.4.7 Das Kommando q – Beenden ...................................... 47312.4.8 Die Kommandos r und w ............................................ 47312.4.9 Das Kommando s – substitute ..................................... 47512.4.10 Das Kommando y ....................................................... 479
12.5 sed-Scripts ................................................................................. 480
Zwar haben Sie mit der Shell-Programmierung einen Trumpf in der Hand, mit dem Sie wohl fast alle Probleme lösen können. Trotzdem kommt man manchmal an einen Punkt, an dem sich die Lösung als nicht mehr so einfach und relativ umständlich erweist. Hier empfiehlt es sich häufig, auf andere Werkzeuge umzusteigen oder – sofern die Kenntnisse vorhanden sind –sich ein solches Werkzeug (bspw. in C) selbst zu programmieren. Allerdings hat man oft nicht die Zeit und Lust, gleich wieder etwas Neues zu erfinden. Wenn Sie also mit der Shell am Limit sind, ist ein Umstieg auf andere »Werkzeuge« wie awk oder auch Perl sinnvoll. 485
13 awk-Programmierung ............................................................ 485
13.1 Einführung und Grundlagen von awk ......................................... 48513.1.1 History und Versionen von awk ................................... 48613.1.2 Die Funktionsweise von awk ....................................... 487
13.2 Aufruf von awk-Programmen ..................................................... 48813.2.1 Grundlegender Aufbau eines awk-Kommandos ............ 48813.2.2 Die Kommandozeilen-Optionen von awk .................... 49013.2.3 awk aus der Kommandozeile aufrufen ......................... 49113.2.4 awk in Shellscripts aufrufen ......................................... 49113.2.5 awk als eigenes Script ausführen ................................. 493
13.3 Grundlegende awk-Programme und -Elemente .......................... 49313.3.1 Ausgabe von Zeilen und Zeilennummern ..................... 49413.3.2 Felder ......................................................................... 495
13.4 Muster (bzw. Adressen) von awk-Scripts .................................... 50013.4.1 Zeichenkettenvergleiche ............................................. 50013.4.2 Vergleichsausdrücke ................................................... 50113.4.3 Reguläre Ausdrücke .................................................... 50313.4.4 Zusammengesetzte Ausdrücke .................................... 50613.4.5 BEGIN und END ......................................................... 506
13.5 Die Komponenten von awk-Scripts ............................................ 50813.5.1 Variablen .................................................................... 50913.5.2 Arrays ......................................................................... 51313.5.3 Operatoren ................................................................. 51713.5.4 Kontrollstrukturen ...................................................... 523
13.6 Funktionen ................................................................................ 52913.6.1 Mathematische Funktionen ......................................... 52913.6.2 Funktionen für Zeichenketten ..................................... 53013.6.3 Funktionen für die Zeit ............................................... 53513.6.4 Systemfunktionen ....................................................... 53713.6.5 Ausgabefunktionen ..................................................... 537
1650.book Seite 13 Dienstag, 8. Juni 2010 1:40 13
Inhalt
14
13.6.6 Eingabefunktion .......................................................... 53813.6.7 Benutzerdefinierte Funktionen .................................... 541
13.7 Empfehlung ............................................................................... 544
Zwar besitzen Sie nun sehr fundierte Kenntnisse rund um die Shell-Programmierung – doch benötigt man für den Feinschliff auch noch die Möglichkeit, sein Wissen umzusetzen. Sie haben im Verlauf des Buchs viele Kommandos kennengelernt, Linux/UNIX bietet jedoch noch eine Menge mehr. 545
14 Linux-UNIX-Kommandoreferenz ........................................... 545
14.1 Kurzübersicht ............................................................................ 54614.2 Dateiorientierte Kommandos ..................................................... 554
bzcat – Ausgabe von bzip2-komprimierten Dateien.................... 554cat – Datei(en) nacheinander ausgeben ...................................... 554chgrp – Gruppe von Dateien oder Verzeichnissen ändern ........... 554cksum/md5sum/sum – eine Prüfsumme für eine Datei ermitteln ........................................................................... 555chmod – Zugriffsrechte von Dateien oder Verzeichnissen ändern ................................................................ 556chown – Eigentümer von Dateien oder Verzeichnissen ändern ................................................................ 557cmp – Dateien miteinander vergleichen...................................... 557comm – zwei sortierte Textdateien miteinander vergleichen ....... 558cp – Dateien kopieren ................................................................ 559csplit – Zerteilen von Dateien (kontextabhängig)........................ 559cut – Zeichen oder Felder aus Dateien herausschneiden ............. 560diff – Vergleichen zweier Dateien ............................................... 560diff3 – Vergleich von drei Dateien .............................................. 561dos2unix – Dateien vom DOS- in UNIX-Format umwandeln ...... 562expand – Tabulatoren in Leerzeichen umwandeln ...................... 562file – den Inhalt von Dateien analysieren .................................... 562find – Suchen nach Dateien ........................................................ 563fold – einfaches Formatieren von Dateien................................... 564head – Anfang einer Datei ausgeben........................................... 565less – Datei(en) seitenweise ausgeben ........................................ 565ln – Links auf eine Datei erzeugen .............................................. 565ls – Verzeichnisinhalt auflisten .................................................... 566more – Datei(en) seitenweise ausgeben ...................................... 566mv – Datei(en) und Verzeichnisse verschieben oder umbenennen ...................................................................... 566nl – Datei mit Zeilennummer ausgeben....................................... 567od – Datei(en) hexadezimal bzw. oktal ausgeben ........................ 568paste – Dateien spaltenweise verknüpfen................................... 568pcat – Ausgabe von pack-komprimierten Dateien....................... 568
1650.book Seite 14 Dienstag, 8. Juni 2010 1:40 13
Inhalt
15
rm – Dateien und Verzeichnisse löschen ..................................... 568sort – Dateien sortieren.............................................................. 569split – Dateien in mehrere Teile zerlegen.................................... 569tac – Dateien rückwärts ausgeben .............................................. 570tail – Ende einer Datei ausgeben ................................................ 570tee – Ausgabe duplizieren .......................................................... 571touch – Anlegen von Dateien oder Zeitstempel verändern.......... 571tr – Zeichen ersetzen bzw. Umformen von Dateien..................... 572type – Kommandos klassifizieren ................................................ 572umask – Dateierstellungsmaske ändern bzw. ausgeben .............. 572uniq – doppelte Zeilen nur einmal ausgeben .............................. 573unix2dos – Dateien vom UNIX- in DOS-Format umwandeln ...... 573wc – Zeilen, Wörter und Zeichen einer Datei zählen ................... 573whereis – Suche nach Dateien.................................................... 574zcat, zless, zmore – (seitenweise) Ausgabe von gunzip-komprimierten Dateien ................................................... 574
14.3 Verzeichnisorientierte Kommandos ............................................ 574basename – gibt den Dateianteil eines Pfadnamens zurück ........ 574cd – Verzeichnis wechseln .......................................................... 574dircmp – Verzeichnisse rekursiv vergleichen ............................... 575dirname – Verzeichnisanteil eines Pfadnamens zurückgeben....... 575mkdir – ein Verzeichnis anlegen ................................................. 575pwd – Ausgeben des aktuellen Arbeitsverzeichnisses .................. 575rmdir – ein leeres Verzeichnis löschen ........................................ 576
14.4 Verwaltung von Benutzern und Gruppe ..................................... 576exit, logout – eine Session (Sitzung) beenden ............................ 576finger – Informationen zu anderen Benutzern abfragen............... 576groupadd, groupmod, groupdel – Gruppenverwaltung (distributionsabhängig) ............................................................... 577groups – Gruppenzugehörigkeit ausgeben.................................. 577id – eigene Benutzer- und Gruppen-ID ermitteln ........................ 577last – An- und Abmeldezeit eines Benutzers ermitteln................ 577logname – Name des aktuellen Benutzers anzeigen .................... 578newgrp – Gruppenzugehörigkeit kurzzeitig wechseln (betriebssystemspezifisch)........................................................... 578passwd – Passwort ändern bzw. vergeben.................................. 578useradd/adduser, userdel, usermod – Benutzerverwaltung (distributionsabhängig) ............................................................... 579who – eingeloggte Benutzer anzeigen......................................... 580whoami – Name des aktuellen Benutzers anzeigen..................... 580
1650.book Seite 15 Dienstag, 8. Juni 2010 1:40 13
Inhalt
16
14.5 Programm- und Prozessverwaltung ............................................ 580at – Kommando zu einem bestimmten Zeitpunkt ausführen lassen ......................................................................... 580batch – Kommando irgendwann später ausführen lassen ............ 581bg – einen angehaltenen Prozess im Hintergrund fortsetzen ....... 582cron/crontab – Programme in bestimmten Zeitintervallen ausführen lassen ......................................................................... 582fg – einen angehaltenen Prozess im Vordergrund fortsetzen ....... 582jobs – Anzeigen angehaltener bzw. im Hintergrund laufender Prozesse...................................................................... 582kill – Signale an Prozesse mit einer Prozessnummer senden ........ 582killall – Signale an Prozesse mit einem Prozessnamen senden..... 583nice – Prozesse mit anderer Priorität ausführen lassen ................ 583nohup – Prozesse beim Beenden einer Sitzung weiter-laufen lassen............................................................................... 583ps – Prozessinformationen anzeigen ........................................... 584pgrep – Prozesse über ihren Namen finden ................................ 585pstree – Prozesshierachie in Baumform ausgeben ....................... 585renice – Priorität laufender Prozesse verändern........................... 585sleep – Prozesse suspendieren (schlafen legen) ........................... 586su – Ändern der Benutzerkennung (ohne Neuanmeldung) .......... 586sudo – Programm als anderer Benutzer ausführen....................... 587time – Zeitmessung für Prozesse................................................. 587top – Prozesse nach CPU-Auslastung anzeigen (betriebssystemspezifisch)........................................................... 588
14.6 Speicherplatzinformationen ....................................................... 588df – Abfrage des benötigten Speicherplatzes für die Dateisysteme.............................................................................. 588du – Größe eines Verzeichnisbaums ermitteln............................. 588free – verfügbaren Speicherplatz (RAM und Swap) anzeigen (betriebssystemabhängig) ............................................. 589swap – Swap-Space anzeigen (nicht Linux) ................................. 590
14.7 Dateisystem-Kommandos .......................................................... 590badblocks – überprüft, ob ein Datenträger defekte Sektoren hat ............................................................................... 590cfdisk – Partitionieren von Festplatten ....................................... 591dd – Datenblöcke zwischen Device (Low Level) kopieren (und konvertieren)...................................................................... 591dd_rescue – fehlertolerantes Kopieren von Dateiblöcken ........... 593dumpe2fs – zeigt Informationen über ein ext2/ext3-Dateisystem an ........................................................................... 594
1650.book Seite 16 Dienstag, 8. Juni 2010 1:40 13
Inhalt
17
e2fsck – repariert ein ext2/ext3-Dateisystem.............................. 594fdformat – formatiert eine Diskette ............................................ 595fdisk – Partitionieren von Speichermedien.................................. 596fsck – Reparieren und Überprüfen von Dateisystemen................ 597mkfs – Dateisystem einrichten.................................................... 598mkswap – eine Swap-Partition einrichten................................... 599mount, umount – An- bzw. Abhängen eines Dateisystems......... 600parted – Partitionen anlegen, verschieben, vergrößern oder verkleinern ......................................................................... 601prtvtoc – Partitionstabellen ausgeben ........................................ 601swapon, swapoff – Swap-Datei oder Partition (de)aktivieren ..... 601sync – alle gepufferten Schreiboperationen ausführen ................ 601
14.8 Archivierung und Backup ........................................................... 602bzip2/bunzip2 – (De-)Komprimieren von Dateien ...................... 602compress/uncompress – (De-)Komprimieren von Dateien ......... 603cpio, afio – Dateien und Verzeichnisse archivieren ..................... 603crypt – Dateien verschlüsseln ..................................................... 606dump/restore bzw. ufsdump/ufsrestore – Vollsicherung bzw. Wiederherstellen eines Dateisystems.................................. 606gzip/gunzip – (De-)Komprimieren von Dateien .......................... 609mt – Streamer steuern ................................................................ 610pack/unpack – (De-)Komprimieren von Dateien ........................ 611tar – Dateien und Verzeichnisse archivieren................................ 611zip/unzip – (De-)Komprimieren von Dateien .............................. 615Übersicht zu Dateiendungen und den Pack-Programmen............ 616
14.9 Systeminformationen ................................................................. 617cal – zeigt einen Kalender an ...................................................... 617date – Datum und Uhrzeit .......................................................... 617uname – Rechnername, Architektur und OS ausgeben................ 618uptime – Laufzeit des Rechners .................................................. 618
14.10 System-Kommandos .................................................................. 618dmesg – letzte Boot-Meldung des Kernels anzeigen ................... 618halt – alle laufenden Prozesse beenden ...................................... 619reboot – alle laufenden Prozesse beenden und System neu starten ................................................................................. 619shutdown – System herunterfahren............................................ 619
14.11 Druckeradministration ............................................................... 62014.12 Netzwerkbefehle ....................................................................... 621
arp – Ausgeben von MAC-Adressen............................................ 621ftp – Dateien zu einem anderen Rechner übertragen .................. 622hostname – Rechnername ermitteln........................................... 627
1650.book Seite 17 Dienstag, 8. Juni 2010 1:40 13
Inhalt
18
ifconfig – Netzwerkzugang konfigurieren.................................... 627mail/mailx – E-Mails schreiben und empfangen (und auswerten) ......................................................................... 629uuencode/uudecode – Text- bzw. Binärdateien codieren ........... 630netstat – Statusinformationen über das Netzwerk ...................... 631nslookup (host/dig) – DNS-Server abfragen ............................... 631ping – Verbindung zu anderem Rechner testen........................... 632Die r-Kommandos von Berkeley (rcp, rlogin, rsh, rwho) .............. 633ssh – sichere Shell auf anderem Rechner starten ......................... 633scp – Dateien kopieren zwischen unterschiedlichen Rechnern .... 634rsync – Replizieren von Dateien und Verzeichnissen ................... 636traceroute – Route zu einem Rechner verfolgen ......................... 638
14.13 Benutzerkommunikation ............................................................ 638wall – Nachrichten an alle Benutzer verschicken......................... 638write – Nachrichten an andere Benutzer verschicken .................. 639mesg – Nachrichten auf die Dialogstation zulassen oder unterbinden ....................................................................... 639
14.14 Bildschirm- und Terminalkommandos ........................................ 640clear – Löschen des Bildschirms .................................................. 640reset – Zeichensatz für ein Terminal wiederherstellen ................. 640setterm – Terminal-Einstellung verändern .................................. 640stty – Terminal-Einstellung abfragen oder setzen........................ 641tty – Terminal-Name erfragen..................................................... 642tput – Terminal- und Cursorsteuerung........................................ 642
14.15 Online-Hilfen ............................................................................. 642apropos – nach Schlüsselwörtern in Manpages suchen ............... 642info – GNU-Online-Manual ........................................................ 643man – die traditionelle Online-Hilfe............................................ 643whatis – Kurzbeschreibung zu einem Kommando....................... 644
14.16 Alles rund um PostScript-Kommandos ....................................... 64414.17 Gemischte Kommandos ............................................................. 645
alias/unalias – Kurznamen für Kommandos vergeben bzw. löschen .............................................................................. 645bc – Taschenrechner ................................................................... 645printenv bzw. env – Umgebungsvariablen anzeigen ................... 645
In diesem Kapitel finden Sie viele Lösungsansätze zu gewöhnlichen Themen, die man relativ häufig in der Praxis benötigt. Natürlich darf man hier keine kompletten Projekte erwarten, sondern eher Scripts, die weiter ausbaufähig sind bzw. als Anregung für umfangreichere Projekte dienen sollen. Es ist auch gar nicht möglich, für jedes Problem eine ultimative Lösung ausdem Hut zu zaubern, dazu sind die individuellen Ansprüche der einzelnen Anforderungen zu unterschiedlich. 647
15 Die Praxis ............................................................................... 647
15.1 Alltägliche Lösungen .................................................................. 64815.1.1 Auf alphabetische und numerische Zeichen prüfen ...... 64815.1.2 Auf Integer überprüfen ............................................... 649
1650.book Seite 18 Dienstag, 8. Juni 2010 1:40 13
Inhalt
19
15.1.3 echo mit oder ohne -n ................................................ 65115.2 Datei-Utilities ............................................................................ 652
15.2.1 Leerzeichen im Dateinamen ersetzen .......................... 65215.2.2 Dateiendungen verändern ........................................... 65315.2.3 Veränderte Dateien in zwei Verzeichnissen
vergleichen ................................................................. 65515.3 Systemadministration ................................................................ 656
15.3.1 Benutzerverwaltung .................................................... 65615.3.2 Systemüberwachung ................................................... 675
15.4 Backup-Strategien ..................................................................... 68115.4.1 Warum ein Backup? .................................................... 68115.4.2 Sicherungsmedien ....................................................... 68215.4.3 Varianten der Sicherungen .......................................... 68315.4.4 Bestimmte Bereiche sichern ........................................ 68315.4.5 Backup über ssh mit tar ............................................... 68415.4.6 Daten mit rsync synchronisieren .................................. 69115.4.7 Dateien und Verzeichnisse per E-Mail versenden ......... 69415.4.8 Startup-Scripts ............................................................ 697
15.5 World Wide Web und HTML ..................................................... 70415.5.1 Analysieren von access_log (Apache) ........................... 70515.5.2 Analysieren von error_log (Apache) ............................. 709
15.6 CGI (Common Gateway Interface) .............................................. 71115.6.1 CGI-Scripts ausführen ................................................. 71215.6.2 CGI-Environment ausgeben ......................................... 71315.6.3 Einfache Ausgabe als Text ........................................... 71515.6.4 Ausgabe als HTML formatieren ................................... 71715.6.5 Systeminformationen ausgeben ................................... 72015.6.6 Kontaktformular ......................................................... 72215.6.7 Noch ein Tipp ............................................................. 725
Keine Sorge, das Hauptaugenmerk liegt dieses Mal nicht auf dem Erlernen einer weiteren Skriptsprache. Es geht vielmehr darum, das Toolkit Tk vorzustellen, durch das Tcl erst richtig bekannt wurde. 727
16 GUIs mit Tcl/Tk ...................................................................... 727
16.1 Was ist und was kann Tcl/Tk? .................................................... 72716.2 Ein Tcl/Tk-Script starten ............................................................. 72816.3 Variablen ................................................................................... 73016.4 Einfache Ausgabe ...................................................................... 73116.5 Substitutionsmechanismen ........................................................ 731
16.5.1 Variablensubstitution .................................................. 73116.5.2 Befehlssubstitution ..................................................... 73216.5.3 Backslashsubstitution .................................................. 732
16.6 Mathematische Ausdrücke ......................................................... 733
1650.book Seite 19 Dienstag, 8. Juni 2010 1:40 13
Inhalt
20
16.7 Programmstrukturen .................................................................. 73316.7.1 Verzweigungen ........................................................... 73416.7.2 Schleifen ..................................................................... 73516.7.3 Prozeduren (Funktionen) ............................................. 737
16.8 Listen ........................................................................................ 73816.9 Stringverarbeitung ..................................................................... 73816.10 Dateizugriff ................................................................................ 738
16.10.1 open ........................................................................... 73816.10.2 puts ............................................................................ 73916.10.3 gets ............................................................................ 74016.10.4 read ............................................................................ 740
16.11 Der Rest .................................................................................... 74116.12 Das Tk-Toolkit ........................................................................... 74116.13 Eine Einführung ......................................................................... 74116.14 Eine einfache Schaltfläche – button ............................................ 74316.15 Einzeiliges Textfeld – entry ......................................................... 74416.16 Mehrzeiliger Text und ein Menü – text und menu ...................... 74516.17 Mit Ereignissen verbinden – bind ............................................... 74916.18 Layoutmanager (Geometriemanager) – grid und pack ................ 751
16.18.1 pack ............................................................................ 75116.18.2 grid ............................................................................. 754
16.19 Eine Scrollleiste – scrollbar ......................................................... 75616.20 Weitere Eingabe-Widgets – radiobutton, checkbutton,
scale und spinbox ...................................................................... 75716.20.1 radiobutton ................................................................ 75716.20.2 checkbutton ................................................................ 75816.20.3 scale ........................................................................... 75816.20.4 spinbox ....................................................................... 75916.20.5 Beispiel ....................................................................... 760
16.21 frame und labelframe ................................................................. 76216.22 Listen – listbox ........................................................................... 76216.23 Darstellen von Grafiken – canvas ............................................... 76416.24 Ein geteiltes Fenster – panedwindow ......................................... 76516.25 Widgetübersicht ........................................................................ 76616.26 Dialoge (tk_) .............................................................................. 76716.27 Tile-Erweiterung (ttk_) ............................................................... 76716.28 Weitere Empfehlungen .............................................................. 768
1650.book Seite 20 Dienstag, 8. Juni 2010 1:40 13
Inhalt
21
769
Anhang .......................................................................................... 769
A.1 Shell-Builtin-Befehle .................................................................. 769A.2 Externe Kommandos .................................................................. 771A.3 Shell-Optionen .......................................................................... 772A.4 Shell-Variablen .......................................................................... 774A.5 Kommandozeile editieren .......................................................... 781A.6 Wichtige Tastenkürzel (Kontrolltasten) ...................................... 783A.7 Initialisierungsdateien der Shells ................................................ 784A.8 Signale ....................................................................................... 785A.9 Sonderzeichen und Zeichenklassen ............................................ 787A.10 Tastenunterschiede zwischen Mac- und PC-Tastaturen .............. 788A.11 Die Buch-CD ............................................................................. 790
Index .......................................................................................................... 791
1650.book Seite 21 Dienstag, 8. Juni 2010 1:40 13
411
Dieses Kapitel zeigt Ihnen einige sehr hilfreiche »Funktionen«, auf die bisher noch nicht eingegangen werden konnte. Natürlich stellt dies noch lange nicht den kompletten Funktionsumfang der Shell-Funktionen dar, weshalb Sie neben der Linux-UNIX-Kommandoreferenz (Kapitel 14) in diesem Buch im Anhang noch einen Überblick zu allen »Builtins« für die jeweilige Shell finden.
9 Nützliche Funktionen
9.1 Der Befehl »eval«
Ein auf den ersten Blick etwas ungewöhnliches Kommando lautet eval. DieSyntax:
eval Kommandozeile
Mit eval können Sie Kommandos ausführen, als würden Sie diese in derKommandozeile von Tastatur eingeben. Schreiben Sie eval vor einem Kom-mando in die Kommandozeile, wird das Kommando oder die Kommando-folge zweimal ausgeführt. Im Fall einer einfachen Kommandoausführungoder -folge ohne eval ist eine doppelte Bewertung nicht sinnvoll:
you@host > eval ls -l | sort -r...
Anders hingegen sieht dies aus, wenn Sie eine Befehlsfolge in einer Variablenabspeichern wollen, um diese daraufhin ausführen zu lassen:
you@host > LSSORT="ls -l | sort -r"you@host > $LSSORTls: |: Datei oder Verzeichnis nicht gefundenls: sort: Datei oder Verzeichnis nicht gefunden
Sicherlich haben Sie etwas Derartiges schon einmal ausprobiert. Wollen Siedie Befehlsfolge, die Sie in der Variablen LSSORT gespeichert haben, jetzt aus-führen, ist das Kommando eval erforderlich. Die anschließende Fehlermel-dung sagt alles. Verwenden Sie hier am besten mal set -x und sehen Sie sichan, was die Shell aus der Variablen $LSSORT macht:
1650.book Seite 411 Dienstag, 8. Juni 2010 1:40 13
412
Nützliche Funktionen9
you@host > set -xyou@host > $LSSORT+ ls -l '|' sort -rls: |: Datei oder Verzeichnis nicht gefundenls: sort: Datei oder Verzeichnis nicht gefunden
Das Problem ist hierbei also das Pipe-Zeichen. Dieses müsste von der Shellein zweites Mal bewertet werden, aber stattdessen wird die Befehlsfolgegleich ausgeführt, sodass hier das Pipe-Zeichen als Argument von ls bewertetwird. Sie können die Variable LSSORT drehen und wenden wie Sie wollen, dieShells verwenden grundsätzlich einen Ausdruck nur einmal. Hier greift evalmit seiner doppelten Ausführung ein:
you@host > eval $LSSORT...
Schalten Sie wieder die Option -x ein, können Sie erkennen, dass mithilfevon eval die Variable LSSORT zweimal ausgeführt wird:
you@host > eval $LSSORT+ eval ls -l '|' sort -r++ /bin/ls -l++ sort -r...
eval eignet sich also in Shellscripts für die Ausführung von Kommandos, dienicht im Script enthalten sind, sondern erst während der Laufzeit des Scriptsfestgelegt werden. Sinnvoll ist dies beispielsweise, wenn Sie in Ihrem Scriptein Kommando verwenden, das es auf einem bestimmten System nicht gibt.So können Sie dem etwas erfahreneren Anwender eine Möglichkeit geben,sich sein Kommando selbst zusammenzubasteln:
# Name: aeval
while truedo printf "Kommando(s) : " read eval $REPLYdone
Das Script bei der Ausführung:
you@host > ./aevalKommando(s) : var=halloKommando(s) : echo $var
1650.book Seite 412 Dienstag, 8. Juni 2010 1:40 13
413
Der Befehl »eval« 9.1
halloKommando(s) : whoyou :0 Mar 30 14:45 (console)Kommando(s) : echo `expr 5 + 11`16Kommando(s) : asdf./script1: line 1: asdf: command not foundKommando(s) : ps PID TTY TIME CMD 3242 pts/41 00:00:00 bash 4719 pts/41 00:00:00 bash 4720 pts/41 00:00:00 psKommando(s) : echo $$4719Kommando(s) : exityou@host > echo $$3242
Man könnte meinen, man hat eine eigene Shell vor sich.
Es gibt noch einen besonders überzeugenden Anwendungsfall von eval. Miteval haben Sie die Möglichkeit, indirekt auf eine Variable zuzugreifen. AlteC-Fanatiker werden feuchte Augen bekommen, da sich das Ganze wie beiden Zeigern in C anhört. Das Prinzip ist eigentlich einfach, aber nicht gleichdurchschaubar. Daher ein Beispiel:
# Name: aeval_cool
Mo=backup1Di=backup2Mi=backup3Do=backup4Fr=backup5Sa=backup6So=backup7
tag=`date +"%a"`
eval backup=\$$tag
echo "Heute wird das Backup-Script $backup ausgeführt"./$backup
Das Script bei der Ausführung (an einem Mittwoch):
you@host > ./aeval_coolHeute wird das Backup-Script backup3 ausgeführt./backup3
1650.book Seite 413 Dienstag, 8. Juni 2010 1:40 13
414
Nützliche Funktionen9
Durch die Kommando-Substitution wurde veranlasst, dass sich in der Vari-able »tag« die ersten zwei Zeichen des Wochentags befinden. Im Beispiel wares Mittwoch, daher ist tag=Mi. Danach wird es ein wenig seltsam, aber durch-aus logisch:
eval backup=\$$tag
Wollen Sie wissen, was da in den zwei Durchläufen passiert, verwenden Siedoch einfach wieder die Option -x:
set -xeval backup=\$$tagset +x
Ein erneuter Aufruf des Shellscripts:
you@host > ./aeval_cool++ eval 'backup=$Mi'+++ backup=backup3...
Im ersten Durchlauf wird aus \$$tag die Zeichenfolge $Mi. Die Variable »Mi«hat ja den Wert »backup3«, was korrekterweise im zweiten Durchlauf an dieVariable »backup« übergeben wird. Also wird im ersten Durchlauf der Aus-druck backup=\$$tag zu backup=$Mi. Die Zeichenfolge »Mi« hatten Sie jazuvor aus der Kommando-Substitution erhalten. Anschließend durchläufteval den Ausdruck backup=$Mi nochmals, sodass daraus backup=backup3wird. Das erste Dollarzeichen wurde im ersten Durchlauf mit einem Back-slash maskiert und somit vor einem Zugriff der Shell geschützt. Dadurch bliebim zweiten Durchlauf das Dollarzeichen bestehen, sodass hier tatsächlich eineVariable an eine andere Variable überwiesen wurde. Versuchen Sie doch ein-mal, das Ganze ohne eval-Anweisung so kurz und bündig zu gestalten.
9.2 xargs
Unter Linux/UNIX kann man fast alle Befehle auf einzelne oder auch eineganze Liste von Dateien anwenden. Wenn dies nicht möglich sein sollte odersich eine Dateiliste nicht mit einer Wildcard erstellen lässt, könnten Sie dasKommando xargs verwenden. xargs erwartet als Parameter ein Kommando,welches dann auf alle Dateien einer Liste angewandt wird, die von der Stan-dardeingabe gelesen werden. Die Syntax:
1650.book Seite 414 Dienstag, 8. Juni 2010 1:40 13
415
xargs 9.2
kommando1 xargs kommando2
Hierbei rufen Sie praktisch »kommando2« mit den Argumenten auf, die»kommando1« in der Standardausgabe erstellt. Das Prinzip ist recht einfach.Das Script sucht in einer Schleife mit find nach allen Dateien im aktuellenArbeitsverzeichnis (mit Unterverzeichnissen) mit der Endung ».tmp«.
# Name: aremover1
for var in `find . -name "*.tmp"`do rm $vardone
Der Shell-Guru wird hier gleich Einspruch erheben und sagen, das geht nochkürzer:
find . -name "*.tmp" -exec rm {} \;
Ich erhebe auch keinen Anspruch, beide Lösungen dürften bezüglich derLaufzeit gleich schlecht sein. Was aber ist so schlecht an diesem Beispiel?Stellen Sie sich vor, Ihr Script findet eine Datei mit der Endung ».tmp« gleich1000 Mal im aktuellen Arbeitsverzeichnis. Dann wird nach jedem gefunde-nen Ergebnis das rm-Kommando gestartet. Es werden also 1000 Prozesse hin-tereinander gestartet und wieder beendet. Für einen Multi-User-Rechnerkann das eine ziemliche Last sein. Besser wäre es doch, wenn man dem Kom-mando rm all diese Dateien als Argument übergibt und somit einen einzigenrm-Aufruf vornimmt. Und genau das ist der Sinn von xargs. Also sieht dieVerwendung mit xargs wie folgt aus:
you@host > find . -name "*.tmp" -print | xargs rm
Jetzt werden alle aufgelisteten Files auf einmal über die Pipe an xargs weiter-geleitet. xargs übernimmt diese Argumente in einer Liste und verwendet siewiederum für den rm-Aufruf. Leider treten hier gleich wieder Probleme auf,wenn in einem Dateinamen Leerzeichen enthalten sind, wie dies häufigbspw. bei MP3-Musik- und MS-Windows-Dateien der Fall ist. Das Problemist hier nämlich, dass xargs die Dateien anhand der Leerzeichen teilt.
Hierzu können Sie xargs mit dem Schalter -0 verwenden, dann wird die Zei-chenfolge nicht mehr wegen eines Leerzeichens getrennt, sondern nach einerbinären 0. Allerdings wäre dann noch das Problem mit find, welches Sieebenfalls mit einem Schalter -print0 vermeiden können. So werden mit fol-
1650.book Seite 415 Dienstag, 8. Juni 2010 1:40 13
416
Nützliche Funktionen9
gender Kommandoangabe auch diejenigen Dateien gelöscht, bei denen sichein Leerzeichen im Namen befindet:
you@host > find . -name "*.tmp" -print0 | xargs –0 rm
Aber nicht immer stehen – wie hier bei rm – die eingelesenen Listen, die inden Linux-UNIX-Befehl eingefügt werden sollen, an der richtigen Stelle. Solautet z. B. die Syntax zum Verschieben von Dateien mittels mv:
mv Dateiname Zielverzeichnis
Hierzu können Sie die Zeichenkette »{}« für die Dateinamen verwenden.Diese Zeichenfolge wird als Platzhalter für die Liste von Argumenten genutzt.Wollen Sie also, wie im Beispiel oben, nicht die Dateien mit der Endung».tmp« löschen, sondern diese zur Sicherheit erst einmal in ein separates Ver-zeichnis verschieben, so lässt sich dies mit dem Platzhalterzeichen wie folgterledigen:
you@host > find . -name "*.tmp" -print0 | \> xargs –0 mv {} $HOME/backups
Natürlich lässt sich mit xargs und den entsprechenden Optionen noch eineMenge mehr anfangen, weshalb das Lesen der Manualpage sehr empfehlens-wert ist.
9.3 dirname und basename
Mit dem Kommando dirname können Sie von einem Dateinamen den Pfad-anteil lösen und mit basename – das Gegenstück zu dirname – können Sie denreinen Dateinamen ohne Pfadanteil ermitteln. Die Syntax:
basename Dateiname [Suffix]dirname Dateiname
Geben Sie bei basename noch ein »Suffix« an, können Sie auch eine eventuellvorhandene Dateiendung entfernen. Ein einfaches Beispiel:
# Name: abasedir
echo "Scriptname : $0"echo "basename : `basename $0`"echo "dirname : `dirname $0`"
# ... oder die Endung entfernen
1650.book Seite 416 Dienstag, 8. Juni 2010 1:40 13
417
umask 9.4
basename $HOME/Kap005graf.zip .zipbasename $HOME/meinText.txt .txt
Das Script bei der Ausführung:
you@host > $HOME/abasedirScriptname : /home/tot/abasedirbasename : abasedirdirname : /home/totKap005grafmeinText
9.4 umask
Das Kommando umask wird verwendet, um die Benutzerrechte (Lesen (r),Schreiben (w) und Ausführen (x)) für den Benutzer (der ersten drei rwx), dieGruppe (die nächsten drei rwx) und allen anderen (die letzten drei rwx) einzu-schränken, denn standardmäßig würden Dateien mit den Rechten rw-rw-rw(oktal 666) und Verzeichnisse mit rwxrwxrwx (oktal 0777) erstellt.
umask MASKE
Mit dem Kommando umask schränken Sie diese Rechte ein, indem vom Stan-dardwert ein entsprechender umask-Wert abgezogen (subtrahiert) wird. Hier-bei gilt es zu beachten, dass keine Ziffer in umask den Wert 7 überschreitet.Ist etwa eine umask von 26 gesetzt, so würde sich dies beim Erzeugen einerDatei wie folgt auswirken:
Datei : 666umask : 026---------------Rechte : 640
Die Datei würde hier praktisch mit den Rechten 640 (rw-r-----) erzeugt.Bitte beachten Sie außerdem, dass immer nur der Wert des zugehörigen okta-len Satzes subtrahiert wird. Eine umask von 27 hat also nicht den Effekt, dassder Rest von 6 minus 7 von den Rechten für alle anderen in die Gruppe über-tragen wird. Bei einer umask von 27 wären die Rechte, mit der die Datei ange-legt wird, dieselben wie mit 26.
Standardmäßig ist umask auf 0022 bei vielen Distributionen eingestellt. Mit-tlerweile gibt es aber schon Distributionen, die den Benutzer bei der Installa-
1650.book Seite 417 Dienstag, 8. Juni 2010 1:40 13
418
Nützliche Funktionen9
tion nach einem umask-Wert fragen. Selbstverständlich kann der Wert auchzur Laufzeit auf Benutzerebene verändert werden:
you@host > umask0022you@host > touch afil1you@host > ls -l afil1-rw-r--r-- 1 tot users 0 2010-03-31 07:51 afil1you@host > umask 0177you@host > umask0177you@host > touch afil2you@host > ls -l afil2-rw------- 1 tot users 0 2010-03-31 07:52 afil2
Die Veränderung der umask gilt allerdings nur für die Sitzung der laufendenShell (oder auch des laufenden Pseudo-Terminals). Wollen Sie die Maskedauerhaft verändern, müssen Sie die entsprechende Profil- bzw. Startproze-durdatei verändern. Finden Sie nirgendwo anders einen Eintrag, gilt der Ein-trag in /etc/profile (bei FreeBSD /etc/login.conf):
you@host > grep umask /etc/profileumask 022
Ansonsten hängt es davon ab, ob Sie eine echte Login-Shell verwenden (.pro-file) oder eben ein »xterm« mit der Bash (bspw. .bashrc) bzw. mit der Korn-Shell (.kshrc).
9.5 ulimit (Builtin)
Mit ulimit können Sie den Wert einer Ressourcengrenze ausgeben lassenoder neu setzen. Die Syntax:
ulimit [Optionen] [n]
Wird n angegeben, wird eine Ressourcengrenze auf n gesetzt. Hierbei könnenSie entweder harte (-H) oder weiche (-S) Ressourcengrenzen setzen. Stan-
Hinweis
Wenn Sie beim Anlegen eines Verzeichnisses zuvor die umask verändert haben, setzenSie beim Verzeichnis die Ausführrechte (x), da Sie sonst nicht mehr auf das Verzeichniszugreifen können.
1650.book Seite 418 Dienstag, 8. Juni 2010 1:40 13
419
ulimit (Builtin) 9.5
dardmäßig setzt ulimit beide Grenzen fest oder gibt die weiche Grenze aus.Mit »Optionen« legen Sie fest, welche Ressource bearbeitet werden soll.Tabelle 9.1 nennt die Optionen, die hierzu verwendet werden können.
Einen Überblick, welche Grenzen auf Ihrem System vorhanden sind, könnenSie sich mit ulimit und der Option -a verschaffen:
you@host > ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedfile size (blocks, -f) unlimitedmax locked memory (kbytes, -l) unlimitedmax memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8stack size (kbytes, -s) unlimitedcpu time (seconds, -t) unlimitedmax user processes (-u) 2046virtual memory (kbytes, -v) unlimited
Folgende ulimit-Werte werden z. B. gern eingesetzt, um primitive DOS-(Denial of Service-)Angriffe zu erschweren (natürlich sind die Werte auch
Option Bedeutung
-H Harte Grenze. Alle Benutzer dürfen eine harte Grenze herabsetzen, aber nur privilegierte Benutzer können sie erhöhen.
-S Weiche Grenze. Sie muss unterhalb der harten Grenze liegen.
-a Gibt alle Grenzwerte aus.
-c maximale Größe der Speicherabzüge (core-File)
-d maximale Größe eines Datensegments oder Heaps in Kilobyte
-f maximale Anzahl an Dateien (Standardoption)
-m maximale Größe des physischen Speichers in Kilobyte (Bash und Korn-Shell only)
-n maximale Anzahl Filedeskriptoren (plus 1)
-p Größe des Pipe-Puffers (Bash und Korn-Shell only, meistens 512 Bytes)
-s maximale Größe eines Stacksegments in Kilobyte
-t maximale CPU-Zeit in Sekunden
-u maximale Anzahl von User-Prozessen
-v maximale Größe des virtuellen Speichers in Kilobyte
Tabelle 9.1 Optionen für ulimit
1650.book Seite 419 Dienstag, 8. Juni 2010 1:40 13
420
Nützliche Funktionen9
abhängig von der Anwendung eines Rechners). Am besten trägt man solcheWerte in /etc/profile ein (hierbei sind auch die anderen Profil- und Startup-Dateien in Erwägung zu ziehen). Hier also ein Eintrag in /etc/profile, um demDOS-Angreifer eine höhere Hürde zu setzen:
# Core Dumps verhindernulimit -c 0# keine Dateien größer 512 MB zulassenulimit -f 512000# weiches Limit von max. 250 Filedeskriptorenulimit -S -n 250# weiches Maximum von 100 Prozessenulimit -S -u 100# Speicherbenutzung max. 50 MBulimit -H -v 50000# weiches Limit der Speichernutzung 20 MBulimit -S -v 20000
9.6 time
Mit dem Kommando time können Sie die Zeit ermitteln, die ein Script oderein Kommando zur Ausführung benötigt hat.
time Kommando
Ein Beispiel:
you@host > time sleep 3
real 0m3.029suser 0m0.002ssys 0m0.002syou@host > time find $HOME -user tot...real 0m1.328suser 0m0.046ssys 0m0.113s
Die erste Zeit (real) zeigt Ihnen die komplette Zeit vom Start bis zum Endeeines Scripts bzw. Kommandos an. Die zweite Zeit (user) zeigt die Zeit an, diedas Script bzw. das Kommando im eigentlichen User-Modus verbracht hat,und die dritte Zeit (sys) ist die CPU-Zeit, die der Kommandoaufruf oder dasScript im Kernel-Modus (Festplattenzugriff, System-Calls usw.) benötigt hat.Beide Zeiten zusammen (user+sys) ergeben die Gesamtzeit (real).
1650.book Seite 420 Dienstag, 8. Juni 2010 1:40 13
421
typeset 9.7
9.7 typeset
Das Kommando typeset hatten wir ja bereits mehrfach eingesetzt. Trotzdemwill ich es nicht versäumen, es hier nochmals mitsamt seinen Optionen zuerwähnen. Sie wissen ja aus Kapitel 2, »Variablen«, dass diese zunächstimmer vom Typ String, also eine Zeichenkette sind, und dass es egal ist, obSie jetzt Zahlen speichern oder nicht.
typset [option] [variable] [=wert]
typeset definiert dabei die Eigenschaft »option« für die Variable »variable«und setzt gegebenenfalls gleich auch den Wert, sofern dieser angegebenwurde. Die Bash bietet auch das Kommando declare an, welches denselbenZweck wie typeset erfüllt. declare ist nicht in der Korn-Shell vorhanden,weshalb man allein schon aus Kompatibilitätsgründen dem Kommandotypeset den Vorzug lassen sollte. Um die entsprechende Eigenschaft für eineVariable zu setzen, muss man das Minuszeichen verwenden. Bspw. mit
typeset -i var=1
definieren Sie die Variable »var« als eine Integer-Variable. Abschalten kön-nen Sie das Ganze wieder mit dem Pluszeichen:
typeset +i var
Nach dieser Kommandoausführung wird »var« wieder wie jede andere nor-male Variable behandelt und ist kein Integer mehr. Tabelle 9.2 listet die Opti-onen auf, die Ihnen hierbei zur Verfügung stehen.
Option Bash ksh Bedeutung
A X Array
I X x Integer-Variable
R X x Konstante (readonly-Variable)
X X x Variable exportieren
F X x Zeigt Funktionen mit ihrer Definition an.
fx X x Exportiert eine Funktion.
+f x Zeigt Funktionen ohne ihre Definition an.
F X Zeigt Funktionen ohne ihre Definition an.
fu x Deklariert Funktionen im Autoload-Mechanismus.
Tabelle 9.2 Optionen für typeset
1650.book Seite 421 Dienstag, 8. Juni 2010 1:40 13
422
Nützliche Funktionen9
l x Inhalt von Variablen in Kleinbuchstaben umwandeln
u x Inhalt von Variablen in Großbuchstaben umwandeln
Ln x linksbündige Variable der Länge n
Rn x rechtsbündige Variable der Länge n
Zn x Rechtsbündige Variable der Länge n. Leerer Raum wird mit Nullen gefüllt.
Option Bash ksh Bedeutung
Tabelle 9.2 Optionen für typeset (Forts.)
1650.book Seite 422 Dienstag, 8. Juni 2010 1:40 13
439
Die Verwendung von regulären Ausdrücken und grep ist Grundlage eines jeden Linux-UNIX-Anwenders. Und für einen Systemadministra-tor ist sie sowieso unerlässlich, denn es gibt kein vernünftiges System, in dem sie nicht vorkommen. Eine kurze Einführung zu den regulären Aus-drücken wie auch zum Tool grep (und seinen Nachkommen wie bspw. egrep und fgrep) erscheint daher notwendig.
11 Reguläre Ausdrücke und grep
11.1 Reguläre Ausdrücke – die Theorie
Reguläre Ausdrücke (engl. regular expression) sind eine leistungsfähige for-male Sprache, mit der sich eine bestimmte (Unter-)Menge von Zeichenkettenbeschreiben lässt. Es muss allerdings gleich erwähnt werden, dass reguläreAusdrücke kein Tool oder eine Sammlung von Funktionen sind, die voneinem Betriebssystem abhängig sind, sondern es handelt sich in der Tat umeine echte Sprache mit einer formalen Grammatik, in der jeder Ausdruckeine präzise Bedeutung hat.
Regulären Ausdrücke werden von sehr vielen Texteditoren und Programmeneingesetzt. Meistens verwendet man sie, um bestimmte Muster zu suchenund diese dann durch etwas anderes zu ersetzen. In der Linux-UNIX-Weltwerden reguläre Ausdrücke vorwiegend bei Programmen wie grep, sed undawk oder den Texteditoren vi und Emacs verwendet. Aber auch viele Pro-grammiersprachen, u.a. Perl, Java, Python, Tcl, PHP oder Ruby, bieten regu-läre Ausdrücke an.
Die Entstehungsgeschichte der regulären Ausdrücke ist schnell erzählt. DenUrsprung hat ein Mathematiker und Logiker, Stephen Kleene, gelegt. Er giltübrigens auch als Mitbegründer der theoretischen Informatik, besonders derhier behandelten formalen Sprachen und der Automatentheorie. StephenKleene verwendete eine Notation, die er selbst reguläre Menge nannte. Spä-ter verwendete dann Ken Thompson (der Miterfinder der Programmierspra-che C) diese Notationen für eine Vorgänger-Version des UNIX-Editors ed undfür das Werkzeug grep. Nach der Fertigstellung von grep wurden die regulä-
1650.book Seite 439 Dienstag, 8. Juni 2010 1:40 13
440
Reguläre Ausdrücke und grep11
ren Ausdrücke in sehr vielen Programmen implementiert. Viele davon benut-zen die mittlerweile sehr bekannte Bibliothek regex von Henry Spencer.
11.1.1 Elemente für reguläre Ausdrücke (POSIX-RE)
Vorwiegend werden reguläre Ausdrücke dazu verwendet, bestimmte Zei-chenketten in einer Menge von Zeichen zu suchen und zu finden. Die nunfolgende Beschreibung ist eine sehr häufig verwendete Konvention, welchevon fast allen Programmen, die reguläre Ausdrücke verwenden, so eingesetztwird. Gewöhnlich wird dabei ein regulärer Ausdruck aus den Zeichen desAlphabets in Kombination mit den Metazeichen (die hier gleich vorgestelltwerden) gebildet.
Zeichenliterale
Als Zeichenliterale bezeichnet man die Zeichen, die wörtlich übereinstimmenmüssen. Diese werden im regulären Ausdruck direkt (als Wort) notiert. Hier-bei besteht je nach System auch die Möglichkeit, alles in hexadezimaler oderoktaler Form anzugeben.
Beliebiges Zeichen
Für ein einzelnes, beliebiges Zeichen verwendet man einen Punkt. DieserPunkt kann dann für ein fast beliebiges Zeichen stehen.
Zeichenauswahl
Die Zeichenauswahl kennen Sie ebenfalls bereits aus der Shell mit den ecki-gen Klammern [auswahl] (siehe Abschnitt 1.10.6). Alles, was Sie in den ecki-gen Klammern schreiben, gilt dann exakt für ein Zeichen aus dieser Auswahl.Bspw. [axz] steht für eines der Zeichen »a«, »x« oder »z«. Dies lässt sichnatürlich auch in Bereiche aufteilen. Bspw. bei der Angabe von [2-7] bestehtder Bereich aus den Ziffern 2 bis 7. Mit dem Zeichen ^ innerhalb der Zei-
Grenzen von »grep«
Sofern Sie Erweiterungen wie Rückwärtsreferenzen verwenden wollen, sei Perl empfoh-len, weil grep hier leistungsmäßig »ins Gras beißt«. Wobei inzwischen ja verschiedeneregexes (POSIX-RE, Extended-RE und pcre) unterschieden werden. Die Unterschiedesind in den Manuals regex und perlre zu finden. Ein Großteil der Scriptsprachen und Pro-gramme stützt sich auf die pcre (Perl Compatible Regular Expression), welche mittler-weile als die leistungsfähigste gilt.
1650.book Seite 440 Dienstag, 8. Juni 2010 1:40 13
441
Reguläre Ausdrücke – die Theorie 11.1
chenauswahl können Sie auch Zeichen ausschließen. Bspw. mit [^a-f] schlie-ßen Sie die Zeichen »a«, »b«, »c«, »d«, »e« oder »f« aus.
Vordefinierte Zeichenklassen
Manche Implementationen von regulären Ausdrücken bieten auch vordefi-nierte Zeichenklassen an. Sofern Sie keine solch vordefinierten Zeichenklas-sen finden, lässt sich dies auch selbst durch eine Zeichenauswahl in eckigenKlammern beschreiben. Die vordefinierten Zeichenklassen sind letztendlichauch nur eine Kurzform der Zeichenklassen. Tabelle 11.1 nennt einigebekannte vordefinierte Zeichenklassen:
Quantifizierer
Als Quantifizierer bzw. Quantoren bezeichnet man Elemente, die es erlau-ben, den vorherigen Ausdruck in unterschiedlicher Vielfalt in einer Zeichen-kette 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 ein Mal vor-kommen, muss aber nicht. Der Ausdruck kommt also entweder null oder ein Mal vor.
+ Der Ausdruck muss mindestens ein Mal 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 vorkommen.
{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
1650.book Seite 441 Dienstag, 8. Juni 2010 1:40 13
442
Reguläre Ausdrücke und grep11
Gruppierung
Ausdrücke können auch zwischen runden Klammern gruppiert werden.Einige Tools speichern diese Gruppierung ab und ermöglichen so eine Wie-derverwendung im regulären Ausdruck bzw. der Textersetzung über \1. Eslassen sich hiermit bis zu neun Muster abspeichern (\1, \2 ... \9). Bspw.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 zweiteusw.
Alternativen
Selbstverständlich lassen sich auch Alternativen definieren. Hierfür wird dasZeichen | verwendet. Bspw.:
(asdf|ASDF)
bedeutet, dass nach »asdf« oder »ASDF« gesucht wird, nicht aber nach »AsDf«oder »asdF«.
Sonderzeichen
Da viele Tools direkt auf Textdateien zugreifen, finden Sie gewöhnlich nochfolgende Sonderzeichen definiert (siehe Tabelle 11.3):
Sonderzeichen Bedeutung
^ Steht für den Zeilenanfang.
$ Steht für das Zeilenende.
\b Steht für die leere Zeichenkette am Wortanfang oder am Wortende.
\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.
Tabelle 11.3 Sonderzeichen bei regulären Ausdrücken
1650.book Seite 442 Dienstag, 8. Juni 2010 1:40 13
443
grep 11.2
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ückennoch viel mehr schreiben. Damit das hier Beschriebene für Sie kein Buch mitsieben Siegeln bleibt, soll im nächsten Abschnitt mit grep darauf zurückge-griffen werden. Auch in den Abschnitten zu sed und awk hilft Ihnen das Wis-sen über reguläre Ausdrücke weiter. Mehr zu den regulären Ausdrücken fin-den Sie im Internet unter http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/. Wollen Sie gar wissen, wie man reguläre Ausdrücke selbstprogrammieren kann, finden Sie in »C von A bis Z« einen kleinen Abschnittdazu, welchen Sie auch online auf meiner Webseite unter www.pronix.de ein-sehen können.
11.2 grep
Zum Suchen nach bestimmten Mustern in Dateien wird häufig grep verwen-det. grep steht für »Global search for a Regular Expression and Print out mat-ched lines«. Es gibt mittlerweile vier verschiedene solcher grep-Kommandos:
� grep – der Klassiker
� egrep – Kurzform für »Extended Grep«, also ein erweitertes grep, welchesim Gegensatz zu grep noch mehr reguläre Ausdrücke versteht
\> Steht für die leere Zeichenkette am Wortende.
\d Ziffer
\D keine Ziffer
\s Whitespace
\S kein Whitespace
. Zeichen
+ voriger Ausdruck mindestens ein Mal
* voriger Ausdruck beliebig oft
? voriger Ausdruck null oder ein Mal
Sonderzeichen Bedeutung
Tabelle 11.3 Sonderzeichen bei regulären Ausdrücken (Forts.)
1650.book Seite 443 Dienstag, 8. Juni 2010 1:40 13
444
Reguläre Ausdrücke und grep11
� fgrep – Kurzform für »Fixed Grep« (oder gern auch »Faster Grep«), wel-ches weniger reguläre Ausdrücke als grep versteht und dadurch erheblichschneller bei der Suche in großen Dateien ist als grep oder egrep
� rgrep – Kurzform für »Rekursive Grep«. rgrep wird für die rekursiveSuche in Unterverzeichnissen verwendet. Es muss allerdings erwähntwerden, 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 odermehreren Datei(en). Enthält das Muster ein Whitespace, muss es entspre-chend gequotet werden. Das Muster ist also entweder eine gequotete Zei-chenkette oder ein einfaches Wort. Alle anderen Worte hinter dem Musterwerden von grep dann als Datei(en) verwendet, in denen nach dem Mustergesucht wird. Die Ausgabe sendet grep an die Standardausgabe (meistensdem Bildschirm) und nimmt auch keinerlei Änderung an der Eingabedateivor. Die Syntax: grep wort datei1 [datei2] ... [datein]
Ein viel zitiertes Beispiel:
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 Erfolgwird die entsprechende Zeile auf dem Bildschirm ausgegeben. Wird das Mus-ter nicht gefunden, gibt es keine Ausgabe und auch keine Fehlermeldung.Existiert die Datei nicht, wird eine Fehlermeldung auf dem Bildschirm ausge-geben.
Als Rückgabewert von grep erhalten Sie bei einer erfolgreichen Suche denWert 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ückgabe-wert von grep ist in den Shellscripts häufig von Bedeutung, da Sie relativ sel-ten die Ausgaben auf dem Bildschirm machen werden. Und vom Exit-Codehängt es häufig auch ab, wie Ihr Script weiterlaufen 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
1650.book Seite 444 Dienstag, 8. Juni 2010 1:40 13
445
grep 11.2
grep gibt den Exit-Code 1 zurück, somit wurde kein übereinstimmendesMuster gefunden:
you@host > grep gibtsnicht /etc/passwd > /dev/nullyou@host > echo $?1
grep gibt den Exit-Code 2 zurück, die Datei scheint nicht zu existieren (oderwurde, 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 odereiner 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 helfenIhnen dabei, sich mit grep ein Suchmuster zu erstellen. Und natürlich unter-stü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
Das grep eines der ältesten Programme ist, das reguläre Ausdrücke kennt,wurde bereits beschrieben. Welche regulären Ausdrücke grep so alles kennt,wird in Tabelle 11.4 aufgelistet. Allerdings kennt grep nicht alle regulärenAusdrücke, weshalb es außerdem das Kommando egrep gibt, das noch eini-ges 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.
Tabelle 11.4 Reguläre Ausdrücke von grep
1650.book Seite 445 Dienstag, 8. Juni 2010 1:40 13
446
Reguläre Ausdrücke und grep11
^$ komplette Zeile '^wort$' Gibt alle vollständige Zeilen mit dem Muster »wort« aus.
. beliebiges Zeichen 'w.rt' Gibt alle Zeilen aus, die ein »w«, einen beliebigen Buchstaben und »rt« enthalten (bspw. »wort«, »wert«, »wirt«, »wart«).
* beliebig oft 'wort*' Gibt alle Zeilen aus mit beliebig vielen (oder auch gar keinen) des vorangegangenen Zeichens.
.* beliebig viele 'wort.*wort' Die Kombination .* steht für beliebig viele Zeichen.
[] ein Zeichen aus dem Bereich
'[Ww]ort' Gibt alle Zeilen aus, welche Zei-chen in dem angegebenen Bereich (im Beispiel nach »Wort« oder »wort«) enthalten.
[^] kein Zeichen aus dem Bereich
'[^A-VX-Za-z]ort' Die Zeichen, die im angegebe-nen Bereich stehen, werden nicht beachtet (im Beispiel kann »Wort« gefunden werden, nicht aber »Tort« oder »Sort« und auch nicht »wort«).
\< Anfang eines Wortes
'\<wort' Findet hier alles, was mit »wort« beginnt (bspw. »wort«, »wort-reich« aber nicht »Vorwort« oder »Nachwort«).
\> Ende eines Wortes
'wort\>' Findet alle Zeilen, welche mit »wort« enden (bspw. »Vorwort« oder »Nachwort«, nicht aber »wort« oder »wortreich«).
\<\> ein Wort '\<wort\>' Findet exakt »wort« und nicht »Nachwort« oder »wortreich«.
\(...\) Backreferenz '\(wort\)' Merkt sich die eingeschlossenen Muster vor, um darauf später über \1 zuzugreifen. 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«.
Zeichen Funktion Beispiel Bedeutung
Tabelle 11.4 Reguläre Ausdrücke von grep (Forts.)
1650.book Seite 446 Dienstag, 8. Juni 2010 1:40 13
447
grep 11.2
Zu diesen regulären Ausdrücken kennt egrep noch folgende:
Hier jetzt einige Beispiele zu den regulären Ausdrücken mit grep. FolgendeDatei mit folgendem Muster sei hierfür gegeben:
you@host > cat mrolymia.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
Einfachstes Beispiel:
you@host > grep Libanon mrolymia.datSamir Bannout Libanon 1983
Hierbei werden alle Zeilen ausgegeben, die den regulären Ausdruck »Liba-non« in der Datei mrolympia.dat enthalten. Nächstes Beispiel:
x\{m,\} mindestens Wie-derholung des Zeichens
x\{3,\} Mindestens ein 3-maliges Auf-treten des Zeichens »x«.
x\{m,n\} mindestens bis maxmiale Wieder-holung des Zei-chens
x\{3,6\} Mindestens ein 3-maliges Auf-treten des Zeichens »x« bis maxi-mal 6-maliges Auftreten (nicht mehr).
Zeichen Funktion Beispiel Bedeutung
+ mindestens ein Mal 'wort[0–9]+' Es muss mindestens eine Ziffer aus dem Bereich vorkommen.
? null oder ein Mal 'wort[0–9]?' Eine Ziffer aus dem Bereich darf, muss aber nicht vorkommen.
| Alternativen 'worta|wort' das Wort »worta« oder »wortb«
Tabelle 11.5 Weitere reguläre Ausdrucke von egrep
Zeichen Funktion Beispiel Bedeutung
Tabelle 11.4 Reguläre Ausdrücke von grep (Forts.)
1650.book Seite 447 Dienstag, 8. Juni 2010 1:40 13
448
Reguläre Ausdrücke und grep11
you@host > grep '^S' mrolymia.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 Bei-spiel:
you@host > grep '1$' mrolymia.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. DasDollarzeichen steht hierbei für das Ende einer Zeile. Nächstes Beispiel:
you@host > grep Sergio Yates mrolymia.datgrep: Yates: Datei oder Verzeichnis nicht gefundenmrolymia.dat:Sergio Oliva USA 1967 1968 1969
Hier wurde ein Fehler gemacht, da grep das dritte Argument bereits als eineDateiangabe, in der nach einem Muster gesucht wird, behandelt. EinenNamen wie »Sergio Yates« gibt es nämlich nicht in dieser Datei. Damit dasMuster auch komplett zum Vergleich für grep verwendet wird, müssen Sie eszwischen Single Quoten stellen.
you@host > grep 'Sergio Yates' mrolymia.datyou@host > echo $?1
Das nächste Beispiel:
you@host > grep '197.' mrolymia.datArnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975 Franco Columbu Argentinien 1976 1981
Wer war hier in den 70-ern am besten. Damit geben Sie alle Zeilen aus, indenen sich das Muster »197« und ein weiteres beliebiges einzelnes Zeichenbefindet. Sofern Sie wirklich nach einem Punkt suchen, müssen Sie einBackslash davor setzen. Dies gilt übrigens für alle Metazeichen. Nächstes Bei-spiel:
you@host > grep '^[AS]' mrolymia.datSergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975Samir Bannout Libanon 1983
1650.book Seite 448 Dienstag, 8. Juni 2010 1:40 13
449
grep 11.2
Hier wird jede Zeile ausgegeben, die mit dem Zeichen »A« und »S« beginnt.Nächstes Beispiel:
you@host > grep '^[^AS]' mrolymia.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' mrolymia.datSamir Bannout Libanon 1983
Hier liefert grep die Zeile zurück, die mit einem Zeichen »S« beginnt, gefolgtvon beliebig vielen Zeichen und die Zeichenfolge »Libanon« enthält. Nächs-tes Beispiel:
you@host > grep '^S.*196.' mrolymia.datSergio Oliva USA 1967 1968 1969
Ähnlich wie im Beispiel zuvor werden die Zeilen ausgegeben, die mit demZeichen »S« beginnen und die Textfolge »196« mit einem beliebigen weiterenZeichen enthalten. Nächstes Beispiel:
you@host > grep '[a-z]\{14\}' mrolymia.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 Kleinbuchstabensind. Nächstes Beispiel:
you@host > grep '\<Col' mrolymia.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\>' mrolymia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Chris Dickerson USA 1982
1650.book Seite 449 Dienstag, 8. Juni 2010 1:40 13
450
Reguläre Ausdrücke und grep11
Lee 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, indenen sich ein Wort befindet, welches mit »A« endet. Nächstes Beispiel:
you@host > grep '\<Coleman\>' mrolymia.datRonnie Coleman USA 1998 1999 2000 2001 2002 2003 2004
Hierbei wird nach einem vollständigen Wort »Coleman« gesucht. Also kein»AColeman« und auch kein »Colemann«. Nächstes Beispiel:
you@host > grep '\<.*ien.*\>' mrolymia.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«enthalten. Davor und danach können sich beliebig viele Zeichen befinden.Nächstes Beispiel:
you@host > grep '\<[G].*ien\>' mrolymia.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 sichbeliebig viele Zeichen befinden.
Natürlich können Sie grep auch dazu verwenden, in einem ganzen Verzeich-nis die Dateien nach einem bestimmten Muster abzusuchen. Hier können Siewieder das Metazeichen * als Platzhalter für alle Dateien im Verzeichnis ver-wenden:
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 überge-ben Sie grep dann statt einer Datei als drittes Argument für die Eingabe dieDaten durch eine Pipe von der Standardausgabe eines anderen Kommandos.Bspw.:
you@host > ps -ef | grep $USER
1650.book Seite 450 Dienstag, 8. Juni 2010 1:40 13
451
grep 11.2
Hiermit bekommen Sie alle Prozesse aufgelistet, deren Eigentümer der aktu-elle User ist bzw. die dieser gestartet hat. Dabei gibt ps seine Ausgabe durchdie Pipe an die Standardeingabe von grep. grep wiederum sucht dann in derentsprechenden Ausgabe nach dem entsprechenden Muster und gibt gegebe-nenfalls die Zeile(n) aus, die mit dem Muster übereinstimmen. Natürlichkönnen Sie hierbei auch, wie schon gehabt, die regulären Ausdrücke verwen-den. Die Syntax:
kommando | grep muster
Ebenfalls relativ häufig wird grep mit ls zur Suche bestimmter Dateien ver-wendet:
you@host > ls | grep '^scr.*'script1script1~script2script2~
Im Abschnitt zuvor haben Sie mit
you@host > grep 'echo' *
alle Dateien nach dem Muster »echo« durchsucht. Meistens, mir ging eszumindest so, haben Sie neben einfachen Scripts auch noch eine MengeDokumentationen im Verzeichnis herumliegen. Wollen Sie jetzt auch nochdie Dateinamen mithilfe regulärer Ausdrücke eingrenzen, können Sie dieAusgabe 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 dieDateien berücksichtigt, die mit der Zeichenfolge »scrip« beginnen, gefolgtvon beliebig vielen weiteren Zeichen.
11.2.4 grep mit Optionen
Natürlich bietet Ihnen grep neben den regulären Ausdrücken auch noch eineMenge weiterer Optionen an, mit denen Sie das Verhalten, insbesondere derStandardausgabe steuern können. Im folgenden Abschnitt finden Sie eineListe mit den interessantesten und gängigsten Optionen (was bedeutet, dassdies längst nicht alle sind). Reichen Ihnen diese Optionen nicht aus, müssen
1650.book Seite 451 Dienstag, 8. Juni 2010 1:40 13
452
Reguläre Ausdrücke und grep11
Sie in den Manualpages blättern. Als Beispiel dient wieder unsere Dateimrolympia.dat:
you@host > cat mrolymia.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 gefundenwurde, und zwar mit zusätzlich n Zeilen vor und nach dieser Zeile. In derPraxis:
you@host > grep –1 Sergio mrolymia.datLarry Scott USA 1965 1966Sergio Oliva USA 1967 1968 1969Arnold Schwarzenegger Österreich 1970 1971 1972 1973 1974 1975
Hierbei wurde vor und nach der gefundenen Zeile jeweils eine zusätzlicheZeile ausgegeben. Dies ist in der Praxis bei einen etwas längeren Text mitmehreren Abschnitten sehr sinnvoll, da man häufig mit einem ausgegebe-nen Teilsatz aus der Zeile 343 nicht viel anfangen kann.
� -A anzahl – ähnlich wie -n, nur dass noch zusätzlich »anzahl« Zeilen mitausgegeben 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 welcher der reguläre Ausdruck abge-deckt wurde.
� -c – (für count) hiermit wird nur die Anzahl von Zeilen ausgegeben, diedurch den regulären Ausdruck abgedeckt werden.
you@host > grep -c '.*' mrolymia.dat9you@host > grep -c 'USA' mrolymia.dat5
Hier wurden zum Beispiel die Daten aller Sportler ausgegeben und beimnächsten Ausdruck nur noch die Teilnehmer aus den »USA«. 5 von den 9ehemaligen Titelträgern kamen also aus den USA.
1650.book Seite 452 Dienstag, 8. Juni 2010 1:40 13
453
grep 11.2
� -h – bei dieser Option wird der Dateiname, in dem der Suchstring gefun-den 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. EinBeispiel:
you@host > grep 'uSa' mrolymia.datyou@host > grep -i 'uSa' mrolymia.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 deneneine Zeile mit dem entsprechenden Suchmuster gefunden wurde:
you@host > grep -l echo *Kap 1 bis 9.docksh.2010-02-02.linux.i386script1script1~script2script2~
� -n – hiermit wird vor jeder gefundenen Zeile in der Datei die laufende Zei-lennummer mit ausgegeben. Bspw.:
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 eswird 0 zurückgegeben, wenn ein Suchtext gefunden wurde, oder 1, wenn
1650.book Seite 453 Dienstag, 8. Juni 2010 1:40 13
454
Reguläre Ausdrücke und grep11
Suche erfolglos war. Diese Option wird gewöhnlich in Shellscripts ver-wendet, bei denen man sich meistens nur dafür interessiert, ob eine Dateieinen Suchtext enthält oder nicht.
� -s – mit dieser Option werden keine Fehlermeldungen ausgegeben, wenneine Datei 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 angegebe-nen regulären Ausdruck abgedeckt werden:
you@host > grep -v 'USA' mrolymia.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 – eine Abkürzung für \<wort\>. Damit wird nach ganzen Wörtern imSuchtext gesucht:
you@host > grep 'Lib' mrolymia.datSamir Bannout Libanon 1983you@host > grep -w 'Lib' mrolymia.datyou@host >
11.2.5 egrep (extended grep)
Wie Sie bereits erfahren haben, lassen sich mit egrep erweiterte und weitauskomplexere reguläre Ausdrücke bilden. Allerdings wird Otto Normalverbrau-cher (wie auch die meisten Systemadministratoren) mit grep mehr als zufrie-den sein. Komplexere reguläre Ausdrücke gehen natürlich enorm auf Kostender Ausführgeschwindigkeit. Übrigens können Sie einen egrep-Aufruf auchmit grep und der Option -E realisieren:
grep -E regex Datei
Einige Beispiele mit egrep:
you@host > egrep 'Colombo|Columbu' mrolymia.datFranco Columbu Argentinien 1976 1981you@host > egrep 'Colombo|Columbu|Col' mrolymia.dat
1650.book Seite 454 Dienstag, 8. Juni 2010 1:40 13
455
grep 11.2
Franco Columbu Argentinien 1976 1981Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004
Wissen Sie nicht genau, wie man einen bestimmten Namen schreibt, könnenSie mit | mehrere Suchmuster miteinander verknüpfen. Im Beispiel wirdnach »Colombo« oder »Columbu« und im zweiten Beispiel noch zusätzlichnach einer Zeichenfolge »Col« gesucht. Kennen Sie mehrere Personen mitdem Namen »Olivia« und wollen nach einem »Sergio Olivia« und »GregorOlivia« suchen, können Sie das Ganze folgendermaßen definieren:
egrep '(Sergio|Gregor) Olivia' mrolympia.dat
Nächstes Beispiel:
you@host > egrep 'y+' mrolymia.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 Siebspw. alle Zeilen einer Datei ausgeben, die mit mindestens einem oder meh-reren Leerzeichen beginnen, können Sie dies folgendermaßen definieren:
you@host > egrep '^ +' mrolymia.dat
Nächstes Beispiel:
you@host > egrep 'US?' mrolymia.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
Wissen Sie jetzt nicht, ob die Zeichenfolge für die USA »USA« oder »US« lau-tet, können Sie das Fragezeichen verwenden. Damit legen Sie fest, dass hierein Zeichen sein darf, aber nicht muss. Somit wird sowohl die Zeichenfolge»US« als auch »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. Regu-läre Ausdrücke gibt es hierbei nicht – ein Vorteil, wenn Sie nach Zeichenfol-gen suchen, die Metazeichen enthalten.
1650.book Seite 455 Dienstag, 8. Juni 2010 1:40 13
456
Reguläre Ausdrücke und grep11
11.2.7 rgrep
Weil grep nur im aktuellen Verzeichnis sucht, wurde rgrep entwickelt. rgrepsucht mit einer rekursiven Suche in Unterverzeichnissen nach entsprechen-den Mustern. Bei einer großen Verzeichnistiefe kann dies allerdings proble-matisch werden. Wenn Sie bspw. nur das aktuelle Verzeichnis und die direk-ten Unterverzeichnisse durchsuchen wollen, so würde auch ein grep wie
grep regex */*
ausreichen. Mehr zu rgrep entnehmen Sie bitte der Manualpage.
1650.book Seite 456 Dienstag, 8. Juni 2010 1:40 13
791
Index
!-Operator 201!(...|...) 94!=-Operator 190, 195# 66#! 64$! 148$# 149, 157$$ 147$(...) 128$* 149, 155$? 148$@ 149, 157$_ 149${var:+wort} 170${var:=wort} 170${var:?wort} 171${var:-wort} 170$0 146$1 .. $9 153$HOME/.profile 405%-Operator 234& 63&&-Operator 201, 202' (Single Quote) 123( ) (Subshell) 381(DoubleQuote) 123* 89*(...|...) 94+(...|...) 94. 51.. 51.-Operator 66, 137, 338/ 50/dev/null 79/dev/pts 241/dev/ttyp* 241/etc/inputrc 406/etc/profile 400, 405/etc/termcap 250/home 50< - Operator 195<< (Here-Dokument) 259<> (Umlenkung) 287==-Operator 195=-Operator 190
> - Operator 195? 89?(...|...) 94@(...|...) 94` (Back Quotes) 125| (Pipe) 85|| - Operator 201||-Operator 204~ 94
A
access_log 705adduser 668afio 603alias 39, 356, 645allow_null_glob_expansion 145anacron 394Apache
access_log 705error_log 709Fehler-Logdateien analysieren 709Logdatei analysieren 705
apropos 642Argumente 153
Anzahl 157jenseits $9 161Leerzeichen 160setzen 162Vorgabewerte setzen 169
Arithmetische Operatoren 108arp 621Arrays 128
einlesen mit read 269Elemente löschen 131for 224kopieren 132Liste von Werten zuweisen 130löschen 131String-Manipulation 132Werte zuweisen 129Zugriff auf alle Elemente 131Zugriff auf Elemente 131
ash 42A-Shell 42
1650.book Seite 791 Dienstag, 8. Juni 2010 1:40 13
792
Index
at 580Aufrufreihenfolge 340Ausführzeit ermitteln 420Ausgabe 242
Bildschirm löschen 250echo 46, 242print 246printf 246tput 250Umlenken mit exec 279
autoload 359Autovervollständigung 782awk 117, 485
$0 512Adressen 500Aktionsteil 488Anzahl Felder 496ARGC 511, 512ARGV 511, 512arithmetische Operatoren 518Array 513assoziative Arrays 514Aufbau 488Aufruf 488Ausgabefunktionen 537Bedingungsoperatoren 521BEGIN-Block 506benutzerdefinierte Funktionen 541break 528close 539continue 528Dekrementoperator 521do while-Schleife 526Einführung 485Eingabefunktionen 538Elemente 493END-Block 506ENVIRON 512exit 528Felder ausgeben 495Feldoperator 522FILENAME 512FNR 512formatierte Ausgabe 497for-Schleife 525FS 512function 541Funktionen 529gawk 486
getline 538gsub 531History 486if-Verzweigung 524index 532Inkrementoperator 521Kommandozeile 491Kommandozeilen-Argumente 511Kommandozeilenoptionen 490Kontext 517Kontrollstrukturen 523Leerzeichen 522length 532logische Operatoren 520match 533mathematische Funktionen 529Muster 500Musterteil 488nawk 486next 528NF 496, 512NR 494, 512oawk 486ODER-Verknüpfung 506OFMT 512OFS 512Operatoren 517Optionen 490ORS 512print 537reguläre Ausdrücke 503RLENGTH 512RS 512RSTART 512Script 493, 508Shebang-Zeile 508Shellscript 491split 533sprintf 533Sprungbefehle 528strftime 535Stringfunktionen 118, 530sub 531SUBSEP 512substr 534Syntax 488Systemfunktionen 537systime 535tolower 534
1650.book Seite 792 Dienstag, 8. Juni 2010 1:40 13
793
Index
toupper 534UND-Verknüpfung 506Variablen 509Vergleichsausdrücke 501Vergleichsoperatoren 501Versionen 486vordefinierte Variablen 512while-Schleife 526Wörter ausgeben 495Zeichenkettenfunktionen 530Zeichenkettenvergleiche 500Zeilen ausgeben 494Zeilennummer ausgeben 494Zeitfunktionen 535zusammengesetzte Ausdrücke 506
B
Back Quotes 125Backslashsubstitution 732Backup 681
cpio 694gzip 694mail 694rsync 691Sicherungsmedien 682ssh 684Strategien 683synchronisieren 691tar 684uuencode 694Varianten 683Warum 681
badblocks 590basename 416, 574BASH 151Bash 41BASH_ENV 144, 404, 406bash_login 401, 405bash_logout 406bash_profile 401, 405BASH_VERSINFO 144BASH_VERSION 151bashrc 401, 404batch 581bc 108, 645
bin 110dec 110hex 110
Befehlssubstitution 732Benutzerdefinierte Signale 361Benutzeroberfläche 33
grafische Oberfläche 33Kommandozeile 33
Benutzer-Verwaltung 656, 668Betriebssystem 44bg 392, 582Bourne-Again-Shell 41Bourne-Shell 41Brace Extension 92break 234Builtin 39, 340, 341, 409Builtin-Befehle 769bunzip2 602bzcat 554bzip2 602
C
cal 617case 210
esac 210Kommandozeilenoptionen 216Vergleichsmuster 212Wildcards 214
cat 47, 554cd 52, 574cdable_vars 145CDPATH 141cfdisk 591CGI-Scripte 711
ausführen 712chgrp 554chmod 60, 556chown 557cksum 555clear 640cmp 557COLUMNS 142comm 558command.com 33command_oriented_history 145compress 603continue 233Core-Dump 362cp 48, 559cpio 603, 694cron 394, 582
1650.book Seite 793 Dienstag, 8. Juni 2010 1:40 13
794
Index
cron-daemon 394crontab 394
-e 398Eintrag (Syntax) 396-l 398-r 398
crypt 606csh 41C-Shell 41csplit 559cut 112, 560
D
Daemon-Prozess 73daemons 394
anacron 394cron 394
date 617Dateiart 56Dateiattribute 55Dateien 55
Attribute 55auflisten 47ausgeben 47Dateityp 56Dateityp ermitteln 198Endung verändern 653erzeugen 49Existenz überprüfen 198kopieren 48löschen 49Namen 54Namen mit Leerzeichen 652Status ermitteln 197suchen und ersetzen 475umbennenen 49Utilities 652vergleichen 655verschieben 49versteckte 92Wörter zählen 48Zeichen ersetzen 479Zeichen zählen 48Zeilen einfügen 467, 471Zeilen ersetzen 468Zeilen löschen 469Zeilen zählen 48zeilenweise einlesen 257
Zeitstempel vergleichen 198Zugriffsrechte 56Zugriffsrechte ermitteln 198
Dateikreierungsmaske 417Dateiname 54Dateinamen-Substitution 219Dateityp 56Datenfluss 76Datenstrom 76
Ausgabe umleiten 77Eingabe umleiten 82Fehlerausgabe umleiten 79
dd 271, 591dd_rescue 593Debuggen 70, 423, 428
DEBUG 431Debug-Ausgabe 436ERR 431LINENO 433Syntax überprüfen 436Tracen 429Variablen überprüfen 435
Debugging-Tools 437DEBUG-Signal 431Deskriptoren 282Device File 55df 588, 675dialog 295
--backtitle 306--checklist (Auswahlliste zum ankreuzen)
302--clear 306--gauge (Fortschrittszustand) 304--infobox (Hinweisfenster ohne Bestäti-
gung) 299--inputbox (Text-Eingabezeile) 299--menu (Menü) 301--msgbox (Nachrichtenbox mit Bestätigung)
298--radiolist (Radiobuttons zum auswählen)
303--textbox (Dateibetrachter) 300--title 306--yesno (Entscheidungsfrage) 296
Dialogfenster 295diff 560diff3 561dig 631dircmp 575
1650.book Seite 794 Dienstag, 8. Juni 2010 1:40 13
795
Index
dirname 416, 575DIRSTACK 144dmesg 618do 218done 218dos2unix 562Double Quotes 123Druckerbefehle 620du 588dump 606dumpe2fs 594
E
e2fsck 594echo 46, 242, 341, 651
gnuplot 320Echtzeit-Prozesse 378Editieren
Kommandozeile 781EDITOR 142Editor 58egrep 443, 454Eingabe 255
Arrays einlesen 269einzelnes Zeichen einlesen 271Funktionstasten abfragen 272Here-Dokument 259Inline-Eingabeumleitung 259Passworteingabe 279Pfeiltasten abfragen 272read 255Tastendruck abfragen 271umlenken mit exec 279
elif 183else 181Endlosschleifen 236ENV 142, 402, 406env 645ERRNO 151error_log 709ERR-Signal 431Ersatzmuster 87
* 89? 89Brace Extension 92Muster-Alternativen 93Zeichenbereiche 90Zeichenklassen 91
esac 210Escape-Sequenzen 245, 787EUID 151eval 411exec 279exit 68, 352, 576Exit-Status 69, 148expand 562Expansion 87Expansionen 407export 134Exportieren
Funktionen 338expr 103Externe Kommandos 771
F
Fallunterscheidungcase 210
false 228, 237FCEDIT 142fdformat 595fdisk 596Fehler-Logdateien analysieren 709Fehlersuche 423, 428
DEBUG 431Debug-Ausgabe 436ERR 431LINENO 433Syntax überprüfen 436Tools 437Tracen 429Variablen überprüfen 435
fg 392, 582fgrep 444, 455fi 173FIFO-Prinzip 288FIGNORE 144file 562Filedeskriptoren 282, 287
Anwendungsgebiete 285neuen Filedeskriptor verwenden 284Standarddeskriptoren 282
find 563finger 576Fließkomma-Zahlen 108fold 564
1650.book Seite 795 Dienstag, 8. Juni 2010 1:40 13
796
Index
for 217Arrays 224Dateinamen-Substitution 219do 218done 218Kommando-Substitution 221mit Schleifenzähler 225Variablen-Interpolation 224
FPATH 143, 359free 589fsck 597ftp 622FUNCNAME 346function 336Funktionen 40, 335
alias 356Auflisten 342Aufruf 336Aufrufreihenfolge 340autoload 359Bibliothek 339Definition 335exit 352exportieren 338FUNCNAME 346function 336globale Variablen 352Kommando-Substitution 349local 355lokale Variablen 351, 352Name der Funktion ermitteln 346Parameterübergabe 344return 348Rückgabe mehrerer Werte 350Rückgabewert 347Typ bestimmen 341Typ ermitteln 340unalias 357weitere Funktionen aufrufen 342
Funktionstasten abfragen 272
G
gawk 486Gerätedatei 55Gerätename 55Gerätesignale 361getline 538
getopts 166getty 239glob_dot_filenames 145Globbing 87GLOBIGNORE 144gnuplot 308
3D-Plots 332Abstand der Ausgabe 326Anwendungsgebiete 309ausführen 309Ausgabe 313Batch-Betrieb 319Batch-Datei 319Beschriftung 323echo 320eigene Funktionen 314Größe der Ausgabe 326Here-Dokument 320Laden eines Plots 319Linien 324neu zeichnen 318Offset für X-Achse 327Parameter 311plot 310Plot-Style festlegen 321Punkte 324replot 318Samplerate verändern 327Shellscript 320speichern eines Plots 319splot 332Textdaten interpretieren 315Variablen 311, 314Zeit-Daten 329
grep 443egrep 454Grundlagen 444Optionen 451Pipes 450reguläre Ausdrücke 445
groupadd 577groupdel 577groupmod 577GROUPS 144groups 577gsub 531gunzip 609gzip 609, 694
1650.book Seite 796 Dienstag, 8. Juni 2010 1:40 13
797
Index
H
halt 619head 565, 666Heim-Verzeichnis 50Here-Dokument 259
gnuplot 320read 262
Hintergrundprozess 63, 379$! 148bg 392fg 392hervorholen 379Job-Verwaltung 390nohup 380SIGHUP 380
histchars 146HISTCMD 151HISTCONTROL 144HISTFILE 143HISTFILESIZE 144HISTIGNORE 144history_control 146HISTSIZE 143Holdspace 458HOME 141host 631HOSTFILE 144HOSTNAME 145hostname 627hostname_completion_file 146HOSTTYPE 151
I
id 577if 173
elif 183else 181Kommandos testen 175Kommandoverkettung 178Pipes 178
ifconfig 627IFS 141, 263IGNOREEOF 145index 532info 643init 698
Runlevel 698
init-Scripte 697Inline-Eingabeumleitung 259INPUTRC 145inputrc 406Integerarithmetik 103, 105
J
jobs 391, 582Job-Verwaltung 390
bg 392fg 392jobs 391
K
kill 365, 391, 582killall 583Kommando 39
adduser 579, 668afio 603Alias 39alias 356, 645apropos 642arp 621at 580auf mehreren Rechnern ausführen 676awk 117, 485badblocks 590basename 416, 574batch 581bc 108, 645bg 392, 582Builtin 39, 341, 769bunzip2 602bzcat 554bzip2 602cal 617cat 47, 554cd 52, 574cfdisk 591chgrp 554chmod 60, 556chown 557cksum 555clear 640cmp 557comm 558compress 603
1650.book Seite 797 Dienstag, 8. Juni 2010 1:40 13
798
Index
cp 48, 559cpio 603, 694cron 394, 582crypt 606csplit 559cut 112, 560date 617dd 271, 591dd_rescue 593df 588, 675diff 560diff3 561dig 631dircmp 575dirname 416, 575dmesg 618dos2unix 562Drucker- 620du 588dump 606dumpe2fs 594e2fsck 594echo 46, 242, 651egrep 454env 645ereignisabhängige Ausführung 207eval 411exec 279exit 68, 576expand 562export 134expr 103Extern- 771fdformat 595fdisk 596fg 392, 582fgrep 455file 562find 563finger 576fold 564free 589fsck 597ftp 622Funktionen 40getopts 166grep 443groupadd 577groupdel 577
groupmod 577groups 577gunzip 609gzip 609, 694halt 619head 565, 666host 631hostname 627id 577ifconfig 627info 643jobs 391, 582kill 365, 582killall 583last 577, 666less 565let 106, 189ln 565logname 578logout 76, 576ls 47, 566mail 629, 694mailx 629, 694man 643md5 555md5sum 555mesg 639mkdir 53, 575mkfifo 288mkfs 598mknod 288mkswap 599more 566mount 600mt 610mv 49, 566netstat 631newgrp 578nice 377, 583nl 567nohup 380, 583nslookup 631od 568pack 611parted 601passwd 578, 668paste 114, 568pcat 568pgrep 585
1650.book Seite 798 Dienstag, 8. Juni 2010 1:40 13
799
Index
ping 632Postscript- 645print 246printenv 645printf 246Programme 40prtvtoc 601ps 73, 584pstree 585pwd 50, 575rcp 633read 255, 409reboot 619renice 377, 585reset 640restore 606return 348rgrep 456r-Kommandos 633rlogin 633rm 49, 568rmdir 53, 576rsh 633rsync 636, 691rwho 633scp 634sed 117select 290set 162setterm 640Shellscript 40shift 158shutdown 619sleep 586sort 569split 569ssh 633, 676, 684ssh-keygen 635stty 271, 641su 586sudo 587sum 555swap 590swapoff 601swapon 601sync 601tac 570tail 570tar 611, 684
tee 86, 571test 186time 420, 587top 73, 588touch 49, 571tput 250, 642tr 115, 572traceroute 638trap 366tty 395, 642type 340, 572typeset 107, 139, 421ufsdump 606ufsrestore 606ulimit 418umask 417, 572umount 600unalias 357, 645uname 618uncompress 603uniq 573unix2dos 573unpack 611unset 101unzip 615uptime 618useradd 579, 668userdel 579usermod 579uudecode 630uuencode 630, 694wait 378wall 638wc 48, 573whatis 644whereis 574who 45, 580whoami 45, 580write 639xargs 414zcat 574zip 615zless 574zmore 574
Kommandoersetzung 125Kommando-Substitution 122, 125, 221
erweiterte Syntax 128Funktionen 349Kommandozeilen-Parameter setzen 164
1650.book Seite 799 Dienstag, 8. Juni 2010 1:40 13
800
Index
Kommandoverkettung 178Kommandozeile 33
Autovervollständigung 782Crashkurs 45editieren 781
Kommandozeilenoptionenauswerten 166getopts 166
Kommandozeilen-Parameter 153Anzahl überprüfen 188Setzen 162über $9 161verschieben 158Vorgabewerte setzen 169
Kommentare 66Konstante 102, 426Kontrollstrukturen 173
bedingte Anweisung 173case 210elif 183else 181for 217if 173Kommandos testen 175Schleifen 217Sprünge 232until 229while 227
Kontrolltasten 783Konvertierungen 110Korn-Shell 41ksh 41kshrc 402, 404, 406
L
LANG 143last 577, 666LC_ALL 143LC_COLLATE 143LC_CTYPE 143LC_MESSAGES 143length 532less 565let 106, 189Limits
ermitteln 418setzen 418
LINENO 150, 433
LINES 143ln 565local 355Logdateien analysieren 705Login-Shell 75Logische Ausdrücke
Klammern 205Logische Fehler 428Logische Verknüpfung 201LOGNAME 141logname 578logout 76, 576ls 47, 566
M
MAIL 141mail 629, 694MAILCHECK 141MAILPATH 142MAILTO 398mailx 629, 694man 643MANPATH 142match 533MATCHTYPE 145Mathematische Funktionen 108md5 555md5sum 555Menüs
select 290mesg 639mingetty 240mkdir 53, 575mkfifo 288mkfs 598mknod 288mkswap 599more 566mount 600mt 610Muster-Alternativen 93mv 49, 566
N
Named Pipe 288, 387nawk 486Negationsoperator 201
1650.book Seite 800 Dienstag, 8. Juni 2010 1:40 13
801
Index
netstat 631newgrp 578nice 377, 583nl 567NLSPATH 143no_exit_on_failed_exec 146noclobber 146nohup 380, 583nolinks 146notify 146nslookup 631
O
oawk 486od 568ODER-Operator 201
|| 201-o 201
ODER-Verknüpfung 204OLDPWD 150Operator
arithmetisch 108logische 201Negation 201
OPTARG 150OPTERR 145OPTIND 150OSTYPE 151
P
pack 611Parameter 153parted 601passwd 578, 668Passworteingabe 279paste 114, 568PATH 142Patternspace 458pcat 568pdksh 41Perl 38pgrep 585PID 73ping 632Pipes 85
grep 450named 288, 387
PIPESTATUS auswerten 179Pipestatus auswerten 180zeilenweise einlesen 258
PIPESTATUS 145, 179Plattenplatzbenutzung 656Plotter
gnuplot 308Positionsparameter
verschieben 158Postscript-Kommandos 645PPID 150print 246printenv 645printf 246Profildaten 399profile 401Programm 39, 40PROMPT_COMMAND 151Prozess 73
Ausführzeit ermitteln 420Daemon 73Echtzeit 378gestoppt 379Hintergrundprozess 379Job-Verwaltung 390Kennung 73nohup 380Nummer 73Priorität 377Priorität erhöhen 378Priorität verringern 378Profildaten 399ps 73Shellscript 73Startprozess 399Subshell 73, 381Timesharing 377top 73Umgebungsvariablen 140warten 378
Prozesse beendenSIGKILL 663SIGTERM 663
Prozesskennung 73Prozess-Verwaltung 659prtctoc 601ps 73, 584PS1 142PS2 142
1650.book Seite 801 Dienstag, 8. Juni 2010 1:40 13
802
Index
PS3 143PS4 71, 143pstree 585pts 240PWD 150pwd 50, 575
Q
Quantifizierer 441Quoting 122
Back Quotes 125Double Quotes 123Leerzeichen 124Single Quotes 123Zeilenumbruch 124
R
RANDOM 150rbash 42rcp 633read 255, 409
Arrays einlesen 269Ausgabetext vorgeben 270Default-Variable 271Here-Dokument 262Optionen 256Pipes 258REPLY 271systemabhängiges 270Taste abfragen 272zeilenweise einlesen einer Datei 257
readonly 102reboot 619Rechnen 103
Fließkomma-Zahlen 108mathematische Funktionen 108
Reguläre Ausdrücke 439, 442, 443, 478$ 442* 443+ 443. 440? 443^ 442Alternativen 442awk 503beliebiges Zeichen 440Einführung 439
Elemente (POSIX) 440grep 445Gruppierung 442Quantifizierer 441sed 466Sonderzeichen 442Zeichenauswahl 440Zeichenklassen 441Zeichenliterale 440
Remote Shell 44renice 377, 585REPLY 150, 271reset 640restore 606Restrict Shell 42return 348rgrep 444, 456r-Kommandos 633rlogin 633rm 49, 568rmdir 53, 576rsh 44, 633rsync 636, 691Rückgabewert 348Runlevel 698rwho 633rzsh 42
S
Scheduling-Algorithmus 377Schleifen 217
abbrechen mit Signalen 372break 234continue 233Endlosschleifen 236for 217Sprünge 232until 229while 227
scp 634SECONDS 150Secure Shell 44sed 117, 457
Adressen 462a-Kommando 467arbeiten mit Puffern 469Ausgabe 459, 472beenden 473
1650.book Seite 802 Dienstag, 8. Juni 2010 1:40 13
803
Index
c-Kommando 468Dateien 460d-Kommando 469Flags 465g-Flag 475G-Kommando 469g-Kommando 469globale Ersetzung 475Grundlagen 457H-Kommando 469h-Kommando 469Holdspace 458, 469i-Kommando 471Kommandos 464Optionen 465Patternspace 458, 469p-Kommando 472Probleme 478Puffer 457, 469q-Kommando 473reguläre Ausdrücke 466, 478r-Kommando 473Schreiben 459Scripts 480s-Kommando 475suchen und ersetzen 475Syntax 458Versionen 457w-Kommando 473x-Kommando 469y-Kommando 479Zeichen ersetzen 479Zeilen einfügen 467, 471Zeilen ersetzen 468Zeilen löschen 469
select 290do 291done 291PS3 292REPLY 291
set 162, 342-u 435-x 429
setterm 640sh 41SHACCT 142Shebang-Zeile 64SHELL 142
Shell 33Alias 39Builtin 39Builtin-Befehle 769externe Kommandos 771Festlegen 63Funktionen 40History 34Initialisierungsdateien 784Kommandozeile editieren 781Login-Shell 75Optionen 772Profildaten 399Signale 785Sonderzeichen 787Startprozess 399Subshell 63, 381Tastaturkürzel 783Variablen- 774Zeichenklassen 788
Shelloptionen 772SHELLOPTS 145Shellscript 39, 40
andere Programmiersprachen 37ausführen 58, 59, 137ausführen ohne Subshell 137Ausführrecht setzen 60awk 491beenden 68beenden mit Signalen 372Datenrückgabe an Scripte 385Datenübergabe zwischen Scripte 383debuggen 70, 423erstellen 58Exit-Status 69Expansionen 407Fehlerarten 427Fehlersuche 423Funktionen 335gnuplot verwenden 320Hintergrundprozess 63Kommandofehler 428Kommandos 407Kommentare 66Kommunikation zwischen Scripten 383Koordinieren 383logische Fehler 428Name 59Named Pipe 387
1650.book Seite 803 Dienstag, 8. Juni 2010 1:40 13
804
Index
ohne Subshell starten 66optimieren 409planen 423Programmierstil 425Prozess 73Scripte synchronisieren 388sed 480Subshell 73Syntaxfehler 427Syntaxüberprüfung 407Testen 424Vorgänge bei der Ausführung 406Was ist ein ... 36Wozu ... 36zeitgesteuertes ausführen 393
Shellvariablen 146, 774IFS 263Umgebungsvariablen 141
Shellvarianten 40shift 158SHLVL 151Short Circuit Test 207shutdown 619SIGINT 237SIGKILL 365Signale 361, 785
abfangen 366Beendigung abfangen 373benutzerdefiniert 361DEBUG 431ERR 431EXIT abfangen 373Gerätesignale 361ignorieren 362, 374kill 365Script beenden 372Scripte synchronisieren 388Senden 365SIGABRT 363, 785SIGALRM 364, 786SIGBUS 363, 785SIGCHLD 364, 786SIGCLD 364, 787SIGCONT 364, 391, 786SIGEMT 363, 785SIGFPE 363, 785SIGHUP 363, 786SIGILL 363, 785SIGINT 363, 786SIGIO 364, 786
SIGIOT 363, 785SIGKILL 363, 365, 663, 786SIGLOST 364, 787Signalhandler einrichten 369SIGPIPE 364, 787SIGPOLL 364, 786SIGPROF 364, 786SIGQUIT 363, 786SIGSEGV 363, 785SIGSTOP 364, 391, 786SIGSYS 363, 785SIGTERM 363, 365, 663, 786SIGTRAP 363, 785SIGTSTP 364, 786SIGTTIN 364, 786SIGTTOU 364, 787SIGURG 364, 786SIGUSR1 365, 787SIGUSR2 365, 787SIGVTALRM 364, 786SIGWINCH 365, 787SIGXCPU 365, 787SIGXFSZ 365, 787Standardaktion 361Systemsignale 361trap 366Übersicht 363zurücksetzen 375
SIGSTOP 391SIGTERM 365Single Quotes 123sleep 586Sonderzeichen 787sort 569split 533, 569sprintf 533ssh 44, 633, 676, 684ssh-keygen 635Standardausgabe 76
Umleiten 77Standardeingabe 76
Umleiten 82Standardfehlerausgabe 76
Umleiten 79Startprozess 399Startup-Scripte 697stderr 76stdin 76stdout 76
1650.book Seite 804 Dienstag, 8. Juni 2010 1:40 13
805
Index
Steuerzeichen 243Stream-Editor 457strftime 535Stringfunktionen 530Strings 111
abschneiden 121aneinanderreihen 120Länge ermitteln 119Teile entfernen 120, 122übersetzen 115Vergleichen 190zusammenfügen 114zuschneiden 112
Stringverarbeitung 738stty 271, 272, 641
echo 279raw 271
su 586sub 531Subshell 63, 381
Prozess 73Variablen der Elternshell 135
Substitutionsmechanismen 731substr 534sudo 587sum 555swap 590swapoff 601swapon 601sync 601Synchronisieren 388, 691Syntaxfehler 427Syntaxüberprüfung 407System-Administration 656
access_log 705Backup 681Benutzer-Verwaltung 656, 668CGI-Scripte 711Fehler-Logdateien analysieren 709HTML 704init-Scripte 697Logdateien analysieren 705Plattenplatzbenutzung 656Prozesse beenden 663Prozess-Verwaltung 659Startup-Scripte 697synchronisieren 691Sys-V-Init-Scripte 697Überwachung 666World Wide Web 704
Systemsignale 361Systemzugang 33systime 535Sys-V-Init-Scripte 697
T
tac 570tail 570tar 611, 684Tastaturkürzel 783Tastendruck abfragen 271Tcl/Tk-Script 728tcsh 42TC-Shell 42tee 86, 571TERM 142Terminal 239
Ausgabe 239, 242Bildschirm löschen 250Cursor steuern 253Eingabe 239, 255Escape-Sequenzen 243Farbe verändern 253Informationen ermitteln 251Pseudo 239pts 240Steuerung 250Steuerzeichen 243Textattribute verändern 251tput 250ttyp 240
terminfo 250test 186
!= 190< 195= 190== 195> 195-0 198-a 201, 202-b 198-c 198-d 198Dateistatus ermitteln 197Dateityp ermitteln 198-e 198-ef 198-eq 187
1650.book Seite 805 Dienstag, 8. Juni 2010 1:40 13
806
Index
Existenz überprüfen 198-f 198-G 198-g 198-ge 187-gt 187-h 198-k 198-L 198-le 187logische Operatoren 201-lt 187-n 190-ne 187-nt 198-o 201, 204-ot 198-p 198-r 198-S 198-s 198-t 198-u 198-w 198-x 198-z 190Zahlen vergleichen 187Zeichenketten vergleichen 190Zeitstempel vergleichen 198Zugriffsrechte ermitteln 198
then 173Tilde-Expansion 94time 420, 587TIMEFORMAT 145Timesharing-Prozesse 377Tischenrechner 108Tk-Toolkit 741TMOUT 143top 73, 588touch 49, 571tput 250, 642
blink 252bold 251boldoff 251clear 254colors 251cols 251cup 254dch1 254
dl1 254Farben verändern 253home 254il1 254Informationen 251lines 251pairs 251rev 252rmu1 252sgr0 252smu1 252Terminal steuern 253Textattribute verändern 251
tr 115, 572traceroute 638trap 366Trennungszeichen
IFS 263true 228, 237tty 395, 642ttyp 240type 340, 572typeset 107, 421
-F 342-f 342Optionen 421Variablen exportieren 139
TZ 142
U
ufsdump 606ufsrestore 606UID 151ulimit 418
Optionen 419umask 417, 572Umgebungsvariablen 140
IFS 263LINENO 71PS4 71Shellvariablen 141
umount 600unalias 357, 645uname 618uncompress 603UND-Operator 201
&& 201-a 201
1650.book Seite 806 Dienstag, 8. Juni 2010 1:40 13
807
Index
UND-Verknüpfung 202uniq 573unix2dos 573Unix-Timestamp 535unpack 611unset 101until 229
do 230done 230
unzip 615uptime 618useradd 668userdel 579usermod 579uudecode 630uuencode 630, 694
V
Variablen 97$! 148$# 157$$ 147$* 155$? 148$@ 157$0 146$1 .. $9 153arithmetische Ausdrücke 106Array 128automatische Shellvariablen 146awk 509definieren 97exportieren 134exportieren mit typeset 139Global 352IFS 263Integer 103Integerarithmetik 105Interpolation 98Kommandozeilen-Parameter 153Konstante 102local 355lokal 351, 352löschen 101Namen 426Namen abgrenzen 100Shell 774Strings 111Stringverarbeitung 112
typeset 107überprüfen 435undefiniert 100vererben an (Sub)Subshell 136Vererbung an Subshell 135Vorgabewerte setzen 169Zahlen 102Zahlen konvertieren 110Zahlen vergleichen 187Zeichenkette 111Zugriff 97
Variablen-Interpolation 224Variablensubstitution 731Versteckte Dateien 92Verzeichnisname 54Verzeichnisse 50
. 51
.. 51absolute Pfadangabe 51Arbeitsverzeichnis ermitteln 50erstellen 53Grundlagen 50Hierarchien 50Home 50löschen 53Namen 54relative Pfadangabe 51vollständige Pfadangabe 51wechseln 52Wurzelverzeichnis 50Zugriffsrechte 56
VISUAL 143
W
wait 378wall 638wc 48, 573Webserver
Logdateien analysieren 705whatis 644whereis 574while 227
do 228done 228
who 45, 580whoami 45, 580Wildcards 87write 639
1650.book Seite 807 Dienstag, 8. Juni 2010 1:40 13
808
Index
X
xargs 414Xdialog 295
Z
Zahlen konvertieren 110Zahlen vergleichen 187
let 189zcat 574Zeichenauswahl 440Zeichenketten 111
abschneiden 121aneinanderreihen 120awk-Funktionen 118Länge ermitteln 119Teile entfernen 120, 122übersetzen 115
vergleichen 190zusammenfügen 114zuschneiden 112
Zeichenketten vergleichenBash 195Korn-Shell 195
Zeichenkettenfunktionen 530Zeichenkettenvergleiche 500Zeichenklassen 441, 788Zeichenliterale 440Zeitfunktionen 535zgrep 574zip 615zless 574zmore 574zsh 42Z-Shell 42Zugriffsrechte 56
ermitteln 198
1650.book Seite 808 Dienstag, 8. Juni 2010 1:40 13