Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Einleitung
TEIL I: Einstieg in Linux
2 Die Installation
3 Erste Schritte
4 Linux als Workstation für Einsteiger
TEIL II: Grundlagen
5 Kernel
6 Grundlagen aus Anwendersicht
TEIL III: Die Shell
7 Die Shell
8 Reguläre Ausdrücke
9 Konsolentools
10 Die Editoren
11 Shellskriptprogrammierung mit der bash
12 Die C-Shell
TEIL IV: System- & Netzwerkadministration
13 Benutzerverwaltung
14 Grundlegende Verwaltungsaufgaben
15 Netzwerkgrundlagen
16 Anwendersoftware für das Netzwerk
17 Netzwerkdienste
18 Mailserver unter Linux
19 LAMP & Co.
20 DNS-Server
21 Secure Shell
TEIL V: Die grafische Oberfläche
22 Die grafische Oberfläche
23 Window-Manager und Desktops
24 X11-Programme
25 Multimedia und Spiele
TEIL VI: Systeminterna
26 Prozesse und IPC
27 Bootstrap und Shutdown
28 Dateisysteme
29 Virtualisierung und Emulatoren
TEIL VII: Programmierung und Sicherheit
30 Softwareentwicklung
31 Crashkurs in C und Perl
32 Einführung in Computersicherheit
33 Netzwerksicherheit überwachen
TEIL VIII: Anhang
A Lösungen zu den einzelnen Aufgaben
B Kommandoreferenz
C X11-InputDevices
D MBR
E Buch-DVDs
F Glossar
G Literatur
Stichwort
Ihre Meinung?

Spacer
Linux von Johannes Plötner, Steffen Wendzel
Das umfassende Handbuch
Buch: Linux

Linux
Rheinwerk Computing
1282 S., 5., aktualisierte Auflage 2012, geb., mit 2 DVDs
49,90 Euro, ISBN 978-3-8362-1822-1
Pfeil 8 Reguläre Ausdrücke
Pfeil 8.1 Der Aufbau regulärer Ausdrücke
Pfeil 8.2 Der Stream-Editor sed
Pfeil 8.2.1 Was bringt mir sed?
Pfeil 8.2.2 Erste Schritte mit sed
Pfeil 8.2.3 sed-Befehle
Pfeil 8.2.4 Nach Zeilen filtern
Pfeil 8.2.5 Wiederholungen in regulären Ausdrücken
Pfeil 8.3 grep
Pfeil 8.3.1 grep -E und egrep
Pfeil 8.3.2 Geschwindigkeitsvergleich
Pfeil 8.4 awk
Pfeil 8.4.1 Nutzen und Interpreter
Pfeil 8.4.2 Der Aufruf des Interpreters awk
Pfeil 8.4.3 Erste Gehversuche
Pfeil 8.4.4 Der Anweisungsblock
Pfeil 8.4.5 Variable
Pfeil 8.4.6 Arrays
Pfeil 8.4.7 Bedingte Anweisungen
Pfeil 8.4.8 Schleifen
Pfeil 8.4.9 Funktionen in awk
Pfeil 8.4.10 Ein paar Worte zum Schluss
Pfeil 8.5 Zusammenfassung
Pfeil 8.6 Aufgaben

Rheinwerk Computing - Zum Seitenanfang

8.2 Der Stream-Editor sedZur nächsten Überschrift

In diesem Unterkapitel soll es nicht um die ehemalige DDR-Partei, sondern um einen mächtigen Editor gehen, der zum Standardumfang eines jeden Unix-Systems gehört. sed ist kein herkömmlicher Editor, wie man ihn etwa von einer grafischen Oberfläche, ncurses-basiert oder dem vi ähnelnd, kennt. sed verfügt über keinerlei Oberfläche, nicht einmal über die Möglichkeit, während der Laufzeit interaktiv Eingaben vorzunehmen.

Abbildung

Abbildung 8.1 Die Arbeitsweise von sed

Der Nutzen von sed ist auch nicht ganz mit dem eines »normalen« Editors gleichzusetzen. Die Aufgabe von sed ist die automatische Manipulation von Text-Streams. Ein Text-Stream ist nichts anderes als ein »Strom von Zeichen«. Dieser kann sowohl direkt aus einer Datei als auch aus einer Pipe kommen. Dabei liest sed den Stream zeilenweise ein und manipuliert Zeile für Zeile nach dem Muster, das ihm vom Anwender vorgegeben wurde.


Rheinwerk Computing - Zum Seitenanfang

8.2.1 Was bringt mir sed?Zur nächsten ÜberschriftZur vorigen Überschrift

Der Editor sed ist oftmals dann von hohem Nutzen, wenn es darum geht, ständig wiederkehrende Daten anzupassen beziehungsweise zu manipulieren. Dies ist besonders in Shellskripten und in der Systemadministration oft der Fall. sed nimmt daher neben awk eine dominante Rolle in der Stream-Manipulation ein. Im Gegensatz zu awk bietet sed keine so guten Möglichkeiten in der Programmierung, dafür ist sed oftmals einfacher und schneller einsetzbar, was die bloße Manipulation von Streams anbelangt. Dabei ist es (ähnlich zu awk) besonders durch die Möglichkeit, reguläre Ausdrücke zu verwenden, äußerst einfach und dynamisch zu handhaben.


Rheinwerk Computing - Zum Seitenanfang

8.2.2 Erste Schritte mit sedZur nächsten ÜberschriftZur vorigen Überschrift

Der Aufruf von sed erfolgt durch Angabe einer Manipulationsanweisung (entweder direkt in der Kommandozeile oder durch eine Skriptdatei, die diese Anweisung(en) enthält). Dazu übergibt man entweder eine Datei, die als Eingabequelle dienen soll, oder tut eben dies nicht, woraufhin sed von der Standardeingabe liest.

Listing 8.6 sed aufrufen

sed [Option] [Skript] [Eingabedatei]

[»]Sofern sed ohne Eingabedatei betrieben wird, muss das Programm manuell durch die Tastenkombination Strg + D beendet werden. Auf dem Bildschirm erscheint dann die Ausgabe ^D.

Zunächst einmal gibt sed standardmäßig alle Zeilen nach der Bearbeitung aus. Um dies zu veranschaulichen, verwenden wir einen sehr einfachen sed-Aufruf. Dabei wird die Anweisung 'p' verwendet. Diese besagt in diesem Fall nichts weiter, als dass alle Zeilen ausgegeben werden sollen. Doch wie Sie sehen ...

Listing 8.7 sed 'p'

user$ sed 'p'
Hallo, Sed!
# dies ist die manuelle Eingabe
Hallo, Sed! # dies bewirkt 'p'
Hallo, Sed! # dies ist die standardmäßige Ausgabe
^D # sed wird durch Strg + D beendet

... gibt sed unsere eingegebene Zeile zweimal aus. Die erste Ausgabe kam durch den Befehl 'p' zustande, die zweite durch die standardmäßige Ausgabe jeder manipulierten Zeile. Um dieses, manchmal unerwünschte Feature zu deaktivieren, muss die Option -n verwendet werden:

Listing 8.8 sed -n 'p'

user$ sed -n 'p'
Hallo, Sed!

Hallo, Sed!
^D

sed mit Eingabedatei

Verwendet man nun eine Datei als Stream-Quelle, muss diese nur zusätzlich beim Aufruf angegeben werden. Da Sie bereits den Befehl 'p' kennen, werden Sie vielleicht schon auf die Idee gekommen sein, sed einmal als cat-Ersatz zu verwenden. cat gibt den Inhalt einer Datei auf dem Bildschirm aus. sed tut dies bei alleiniger Verwendung des 'p'-Befehls ebenfalls.

Listing 8.9 sed mit Eingabedatei

user$ sed -n 'p' /etc/passwd
root:x:0:0::/root:/bin/zsh
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/log:
...

Rheinwerk Computing - Zum Seitenanfang

8.2.3 sed-BefehleZur nächsten ÜberschriftZur vorigen Überschrift

Beschäftigen wir uns nun mit den Befehlen, die uns in sed zur Verfügung stehen. Mit dem ersten Befehl 'p' sind Sie bereits in Kontakt gekommen. Dieser Befehl gibt die Zeilen aus.

Doch wie verwendet man nun einen regulären Ausdruck mit solch einem Befehl? Die Antwort ist recht simpel: Man schreibt ihn in zwei Slashes und den Befehl (je nach Befehl) davor oder dahinter. Alles zusammen setzt man der Einfachheit halber in Hochkommata, damit die Metazeichen nicht anderweitig von der Shell interpretiert werden – etwa so:

Listing 8.10 Verwendung von Slashes

$ sed -n '/[Ff]/p' Standorte

Dieser Ausdruck würde nun alle Zeilen herausfiltern, in denen ein großes oder kleines »f« enthalten ist, und diese anschließend auf der Standardausgabe ausgeben (p).

Hold- und Patternspace

Zur internen Funktionsweise von sed ist noch anzumerken, dass das Programm mit zwei Puffern arbeitet, in denen die Zeilen gespeichert werden. Der erste Puffer ist der Patternspace. In diesen wird eine Zeile geladen, wenn sie einem Muster entsprochen hat. Der zweite Puffer ist der Holdspace. Nach der Bearbeitung einer Zeile wird sie vom Pattern- in den Holdspace kopiert. Hier ein Beispiel:

[zB]Der Befehl x tauscht den Inhalt des Patternspace mit dem des Holdspace. Dies geschieht jedes Mal, wenn eine Zeile ein großes »F« enthält, da wir dies als Muster angegeben haben.

Listing 8.11 Austausch von Hold- und Patternspace

user$ sed '/F/x' Standorte
Augsburg
Bremen

Aschersleben
Bernburg
Berlin
Halle
Essen
Friedrichshafen
Kehlen
...

Wie Sie sehen, folgt nach »Bremen« eine Leerzeile. Dort war der Holdspace noch leer. Da dieser aber mit dem Patternspace (der »Friedrichshafen« enthielt) vertauscht wurde, wurde eine leere Zeile ausgegeben. Nachdem die Leerzeile ausgegeben wurde, befindet sich nun also »Friedrichshafen« im Holdspace. Später wird »Friedrichshafen« ausgegeben, obwohl »Furtwangen« im Patternspace enthalten war. Dies liegt auch wieder daran, dass durch den x-Befehl der Pattern- und der Holdspace vertauscht wurden. Doch es gibt noch einige weitere sed-Befehle, die folgende Tabelle zeigt die wichtigsten.

Tabelle 8.1 sed-Befehle

Befehl Auswirkung

/ausdruck/=

Gibt die Nummern der gefundenen Zeilen aus.

/ausdruck/a\

 

string

Hängt »string« an die Zeile an, in der »ausdruck« gefunden wird (append).

b label

Springt zum Punkt »label« im sed-Skript. Falls »label« nicht existiert, wird zum Skriptende gesprungen.

/ausdruck/c\

 

string

Ersetzt die gefundenen Zeilen durch »string« (change).

/ausdruck/d

Löscht die Zeilen, in denen »ausdruck« gefunden wird (delete).

/ausdruck/D

Löscht den Patternspace bis zum ersten eingebundenen Zeilenumbruch (\n) in »ausdruck«. Sofern weitere Daten im Patternspace vorhanden sind, werden diese übersprungen.

/ausdruck/i\

 

string

Fügt »string« vor der Zeile ein, in der »ausdruck« gefunden wird (insert).

/ausdruck/p

Gibt die gefundenen Zeilen aus (print).

/ausdruck/q

Beendet sed, nachdem »ausdruck« gefunden wurde (quit).

/ausdruck/r datei

Hängt hinter »ausdruck« den Inhalt der Datei »datei« an (read from file).

s/ausdruck/string/

Ersetzt »ausdruck« durch »string«. Ein Beispiel zu diesem Befehl folgt weiter unten.

t label

Falls seit dem letzten Lesen einer Zeile oder der Ausführung eines t-Befehls eine Substitution (s-Befehl) stattfand, wird zu »label« gesprungen. Lässt man »label« weg, wird zum Skriptende gesprungen.

/ausdruck/w datei

Schreibt den Patternspace in die Datei »datei«. Ein Beispiel zu diesem Befehl folgt weiter unten.

/ausdruck/x

Tauscht den Inhalt von Holdspace und Patternspace. Eine Beispielanwendung dieses Befehls finden Sie in Listing 8.11.

y/string1/string2/

Vertauscht alle Zeichen, die in »string1« vorkommen, mit denen, die in »string2« angegeben sind, wobei die Positionen der Zeichen entscheidend sind: Das zweite Zeichen in »string1« wird durch das zweite in »string2« ersetzt usw. Ein Beispiel zu diesem Befehl folgt weiter unten.

[»]Es folgen nun einige Listings zur exemplarischen Anwendung von sed. Zunächst soll der Befehl w angewandt werden, der die gefundenen Ausdrücke in eine Datei schreibt. Um alle anderen Ausdrücke zu unterdrücken, wird die Option -n verwendet. Es sollen dabei alle Zeilen, in denen ein »F« vorkommt, in die Datei out.log geschrieben werden.

Listing 8.11 w-Befehl

$ sed -n '/F/w out.log' Standorte
$ cat out.log
Friedrichshafen
Furtwangen

s-Befehl

Aber auch die Substitution von Ausdrücken ist in sed kein Problem. Mit dem Befehl s kann ohne Weiteres ein Ausdruck durch einen String ersetzt werden. Im Folgenden sollen alle »n«-Zeichen durch den String »123456« ersetzt werden.

Listing 8.12 s-Befehl

$ sed 's/n/123456/' Standorte
Augsburg
Breme123456
Friedrichshafe123456
Ascherslebe123456
Ber123456burg
Berli123456
Halle
Esse123456
Furtwa123456gen
Kehle123456
Krumbach
Os123456abrueck
Kempte123456

y-Befehl

Eine ähnliche Funktionalität bietet der y-Befehl. Dieser Befehl ersetzt keine ganzen Strings, sondern einzelne Zeichen. Er sucht zudem nicht nach Ausdrücken, sondern explizit nach den ihm angegebenen Zeichen. Dem Befehl werden zwei Zeichenketten übergeben. In der ersten steht an jeder Stelle ein Zeichen, das im zweiten String an derselben Stelle ein Ersatzzeichen findet. Daher müssen beide Strings gleich lang sein. Im nächsten Listing soll »a« durch ein »i«, »b« durch ein »j« ... und »h« durch ein »p« ersetzt werden.

Listing 8.13 y-Befehl

$ sed 'y/abcdefgh/ijklmnop/' Standorte
Auosjuro
Brmmmn
Frimlrikpspinmn
Askpmrslmjmn
Bmrnjuro
Bmrlin
Hillm
Essmn
Furtwinomn
Kmplmn
Krumjikp
Osnijrumkk
Kmmptmn

Rheinwerk Computing - Zum Seitenanfang

8.2.4 Nach Zeilen filternZur nächsten ÜberschriftZur vorigen Überschrift

[zB]Ein weiteres Feature von sed ist die Möglichkeit, nach bestimmten Zeilen zu filtern. Dabei kann entweder explizit eine einzelne Zeile oder ein ganzer Zeilenbereich angegeben werden. Gegeben sei die Datei myfile mit dem folgenden Inhalt:

Listing 8.14 myfile

$ cat myfile
Zeile1
Zeile2
Zeile3
Zeile4
Zeile5
Zeile6

Einzelzeilen

Eine Einzelzeile kann durch Angabe der Zeilennummer in Verbindung mit dem p-Befehl herausgefiltert werden. Durch die Option -e lassen sich noch weitere Einzelzeilen in einem einzelnen Aufruf von sed filtern.

Listing 8.15 Einzelzeilen filtern

$ sed -n '2p' myfile
Zeile2
$ sed -n -e '1p' -e '2p' myfile
Zeile1
Zeile2

Zeilenbereiche

Um nun nach Zeilenbereichen zu filtern, gibt man beide Zeilennummern, die diesen Bereich begrenzen, durch ein Komma getrennt an.

Listing 8.16 Zeilenbereiche

$ sed -n '2,5p' myfile
Zeile2
...
Zeile5
$

Das Dollarzeichen steht dabei symbolisch für das Zeilenende:

Listing 8.17 Das Zeichen $

$ sed -n '3,$p' myfile
Zeile3
Zeile4
Zeile5
Zeile6
$ sed -n '$p' myfile
Zeile6

Rheinwerk Computing - Zum Seitenanfang

8.2.5 Wiederholungen in regulären AusdrückenZur vorigen Überschrift

Kommen wir nun zu einem weiteren Feature in Bezug auf die regulären Ausdrücke für sed: das n-fache Vorkommen eines Ausdrucks. Auch für dieses Thema verwenden wir wieder eine Beispieldatei wh (Wiederholung) mit folgendem Inhalt:

Listing 8.18 Die Datei wh

Ktze
Katze
Kaatze
Katatze
Katatatze

Einzelzeichen

Das mehrmalige Vorkommen von Einzelzeichen kann durch den Stern-Operator (*), den wir Ihnen bereits vorgestellt haben, festgestellt werden. Er lässt sich einen regulären Ausdruck eingebauen und bezieht sich auf das ihm vorangestellte Zeichen. Dabei kann dieses keinmal, einmal oder beliebig oft vorkommen.

Listing 8.19 Anwendung des *-Operators

$ sed -n '/Ka*tze/p' wh
Ktze
Katze
Kaatze
$ sed -n '/Kaa*tze/p' wh
Katze
Kaatze

Ganze Ausdrücke

Es ist nicht nur möglich, einzelne Zeichen, sondern auch ganze Ausdrücke beliebig oft vorkommen zu lassen. Dabei wird der jeweilige Ausdruck in Klammern geschrieben (die escaped werden müssen).

Listing 8.20 Der Operator ()

$ sed -n '/\(at\)*/p' wh
Ktze
Katze
Kaatze
Katatze
Katatatze

n Vorkommen

Möchte man hingegen die Anzahl der Vorkommen eines Zeichens oder eines Ausdrucks festlegen, so muss man diese Anzahl in geschweifte Klammern hinter den jeweiligen Ausdruck schreiben. Dabei ist zu beachten, dass auch die geschweiften Klammern als Escape-Sequenzen geschrieben werden.

Im nächsten Listing muss der Ausdruck at zweimal hintereinander vorkommen:

Listing 8.21 Mehrmalige Vorkommen mit dem {}-Operator angeben

$ sed -n '/\(at\)\{2\/p' wh}
Katatze
Katatatze


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Linux Handbuch






 Linux Handbuch


Zum Katalog: Linux Server






 Linux Server


Zum Katalog: Raspberry Pi






 Raspberry Pi


Zum Katalog: Ubuntu 14.04 LTS






 Ubuntu 14.04 LTS


Zum Katalog: Roboter bauen mit Arduino






 Roboter bauen
 mit Arduino


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de