9.Hilfsprogramme für die Arbeit mit Files ========================================= 9.1 Stream-Editor "sed" 9.2 Familie von Zeichenkettensuchprogrammen "grep", "egrep", "fgrep" 9.3 File-Such-Programm "find" |
next | back | 2017 - 1 | Fri Apr 7 14:46:39 CEST 2017 |
9.1. Der Stream-Editor sed =========================== Ein kleiner Übersetzer für alle Fälle. Grundätzliches -------------- sed wurde vom zeilenorientierten, dialogfähigem Editor ed abgeleitet. sed ist nicht dialogorientiert!!!! sed liest die Editorkommandos von der Kommandozeile oder aus einer Datei. sed liest die zu editierenden Daten aus einem File oder von der Standardeingabe. sed gibt die editierten Daten immer auf der Standardausgabe aus!!!!!!! Achtung!!! Nicht die zu editierende Datei gleichzeitig als Standardausgabe benutzen!!! Totaler Datenverlust!!!! sed ist ein kleiner leistungsfähiger Editor für Modifizierung von Dateien oder zur Extrahierung von Daten. Er wird häufig in Shellscripten eingesetzt. Er ist schneller als awk, hat aber eine geringer Leistungsfähigkeit. |
next | back | 2017 - 2 | Fri Apr 7 14:46:39 CEST 2017 |
Prinzipielle Funktionsweise des sed ----------------------------------- 1. Als erstes werden alle Editierkommandos eingelesen (Kommanodzeile oder Skript-Datei) 2. Dann wird die erste Zeile aus der Eingabedatei in einen Eingabepuffer gelesen (Standardeingabe oder File) 3. Jetzt werden der Reihe nach alle Editorkommandos der Reihe nach geprüft, ob sie anwendbar sind und wenn ja sofort ausgeführt. b1 4. Das Ergebnis aller Editorkommandos wir auf die Standardausgabe ausgegeben. 5. Der Eingabepuffer wird gelöscht. 6. Eine neü Zeile wird in den Eingabepuffer gelesen und bei 3. fortgesetzt. Bei Erkennung von EOF beendet sed die Arbeit. |
next | back | 2017 - 3 | Fri Apr 7 14:46:39 CEST 2017 |
Der Aufruf von sed ------------------ sed [-nV] [--quiet] [--silent] [--version] [-e <editorkommando>] [-f <skriptdatei>] [-i[<SUFFIX>] [--in-place[=<SUFFIX>]] [--expression=<editorkommando>] [-r] [--file=< skriptdatei > ] {<dateiname>} -n, --quiet, --silent Zeile wird nur ausgegeben, wenn dies explizit durch ein p-Kommando innerhalb der Editorkommando gefordert wird. -V,--version Ausgabe der Verionsnummer --help Ausgabe einer kurzen Hilfeinformation für den Aufruf von sed -f <Skript-file>, --file=<Skript-file> Definition eines Files, das die Editorkommando enthält. -i[<SUFFIX>] Editieren im aktuellen File -e <editorkommando> Definition eines Editorkommandos. Kann mehrfach vorkommen. Wird nur ein Editorkommando benötigt, kann diese auch ohne "-e" angegeben werden. <dateiname> Name des zu editierenden Files. Mehre Filenamen sind zulässig. Ist kein Filename spezifiziert, wird Standardeingabe benutzt. -r Benutzung von erweiterten (fast vollständigen) regulären Ausdrücken. |
next | back | 2017 - 4 | Fri Apr 7 14:46:39 CEST 2017 |
Beispiele: # einige sed-Kommandos # p - ausgeben # s - ersetzen sed -V sed --version # Version ausgeben sed -e "p" d1 > d1-edit b0 sed "p" d1 > d1-edit # Ausgbe aller Zeilen doppelt sed -e "s/a/aa/" -e p d1 sed "s/a/aa/" d1 # Substitution sed -e s/a/aa/ -e p d1 sed -n -e s/a/aa/ d1 sed -n -e s/a/aa/ -e p d1 sed --quiet -e s/a/aa/ -e p d1 sed --silent -e s/a/aa/ -e p d1 # nur p-Zeilen ausgeben sed -n --expression=s/a/aa/ -e p d1 sed -f s1 -e p d1 sed -e p -f s1 d1 sed -e p -f s1 -e p d1 sed --file=s1 -e p d1 |
next | back | 2017 - 5 | Fri Apr 7 14:46:39 CEST 2017 |
Editorkommando -------------- [<adresse1> [","<adresse2>]]<kommando>[<argument>] [<adresse1>","[<adresse2>]] Durch diese Adressen wird ein Bereich von hintereinander stehenden Zeilen beschrieben. Dabei bedeutet: keine Adresse - alle Zeilen des Eingabefiles eine Adresse - alle Zeilen, auf die die Adresse zutrifft Bereich von Eingabezeilen - alle Zeilen dieses Bereiches, die Grenzen gehören zum Bereich. <adresse1> und <adresse2> stellen Adressen dar. Eine Adresse ist: ganze Zahl - Nummer einer Zeile, bei mehreren Eingabedateien wird fortlaufend gezählt. $ - Dollarzeichen steht für die letzte Eingabezeile, letzte Zeile der letzten Eingabedatei. b2 /<regulärer Ausdruck>/ - adressiert alle Zeilen, die einen String enthalten, der auf den regulären Ausdruck passt. |
next | back | 2017 - 6 | Fri Apr 7 14:46:39 CEST 2017 |
Reguläre Ausdrücke im sed (eingeschränkt) Metazeichen: \ - Maskierung eines Metazeichens ^ - Zeilenanfang $ - Zeilenende . - beliebiges Zeichen, ausser <NL> [... ] - Klasse von Zeichen z.B. [abc] - eines der Zeiche a, b oder c [a-fs-z] - eines der Zeichen a bis f oder s bis z [^...] - Komplementklasse von Zeichen z.B. [^A-Z] - alle Zeichen, ausser Grossbuchstaben * - Null oder beliebig häufiges Auftreten des vorangegangenen Zeichens. z.B. a*b - bedeutet b, ab ,aab ,aaab, ... \(<str>\) - String <str> \{<nr>\} - genau <nr>-maliges Vorkommen \{<nr,\} - mindestens <nr>-maliges Vorkommen \{<nr1,<nr2\} - mindestens <nr1>-maliges Vorkommen, höchstens <nr2>-maliges \<nr> - entspricht dem <nr>-ten Ausdruck der zuvor durch \(<str>\) in dem selben String auftrat. z.B. "^\(.*\)\1$" - entspricht allen Zeilen, die aus zwei gleichen Zeichenketten bestehen. b3 |
next | back | 2017 - 7 | Fri Apr 7 14:46:39 CEST 2017 |
Beispiele: Einfache Zeichenketten: /bin/sed -n -e /o/p d2 /bin/sed -n -e /er/p d2 /bin/sed -n -e /o/,$p d2 /bin/sed -n -e 3,/o/p d2 /bin/sed -n -e /o/,/i/p d2 b4 Zeilenanfang und Zeilenende: ^<String> - <String> am Zeilenanfang <String>$ - <String> am Zeilenende ^<String>$ - Zeile enthält nur <String> ^$ - Leerzeile ^.$ - Zeile mit genau einem Zeichen ^....$ - Zeile mit genau vier Zeichen /bin/sed "/^#/d" d2 - entfernt alle Kommentarzeilen aus b1 Zeichenklassen - Komplementklassen: /bin/sed -n "/[ö]/p" d2 /bin/sed -n "/^[^ö]*$/p" d2 b5 |
next | back | 2017 - 8 | Fri Apr 7 14:46:39 CEST 2017 |
Wiederholungen: /bin/sed -n '/^.\{4\}$/p' d2 /bin/sed -n '/^.\{5,8\}$/p' d2 b6 Wiederholungen von Buchstaben /bin/sed -n '/ir*/p' d2 /bin/sed -n '/irr*/p' d2 b7 n-ter Teilausdruck /bin/sed -n '/\(alle\) \1/p' d3 /bin/sed -n '/\(....\) \1/p' d3 /bin/sed -n '/\(....\).*\1/p' d3 b8 |
next | back | 2017 - 9 | Fri Apr 7 14:46:39 CEST 2017 |
Übersicht sed-Kommandos ----------------------- Zeilenorientierte Kommandos a\ - append lines (Anfügen) c\ - change line (Ersetzen der Zeile) d - delete line (löschen einer Zeile) i\ - insert line (einfügen vor der Zeile) n - next line (Ausgabe des Eingbepuffers) Ersetzungskommandos s - substitute (ersetzen eines regulären Ausdrucks) y - translate (übersersetzen von mehreren Zeichen ) E/A-Kommandos l - list (Ausgabe des Eingabepuffers, nicht druckbare Zeichen werden übersetzt) p - print (Ausgabe des Eingabepuffers) r - read (Lesen einer Datei und auf ausgeben) w - write (Eingabepuffer in Datei schreiben) Mehrzeilen-Kommandos D - delete first part of pattern (Löschen) N - next line (nächste Eingabezeile an Eingabepuffer anhängen) P - print (erster Teil des Eingabepuffers ausgeben) |
next | back | 2017 - 10 | Fri Apr 7 14:46:39 CEST 2017 |
Kommandos für Zwischenspeicherung g - Eingabepuffer wird durch Zwischenspeicher überschrieben G - Zwischenspeicher am Ende des Eingabepuffers anhängen, durch <NL> getrennt h - Zwischenspeicher durch Eingabepuffer überschreiben H - Inhalt des Eingabepuffers am Ende des Zwischspeichers anhängen, durch <NL> getrennt x - exchange (austauschen Zwischenspeicher und Eingabepuffer) Kommandos für die Ablaufsteürung b - branch (Sprung zur Marke) t - test jump (bedingter Sprung im sed-Script) ! - Verneinung der Adressangabe :ma - Marke im sed-Script Sonstige Kommandos q - quit (Ende) = - Ausgabe der Zeilennummer als eigene Zeile # - Kommentar |
next | back | 2017 - 11 | Fri Apr 7 14:46:39 CEST 2017 |
Zeilenorientierte Kommandos --------------------------- a\ - append lines Die nachfolgende Zeile wird nach Ausgabe des Eingabepuffers ausgeschrieben. Sollen mehrere Zeilen angefügt werden, so sind die <NL>-Zeichen durch "\" zu maskieren. Beispiel: /bin/sed '/^#/a\ #--------------------------# ' d2 b9,b10 c\ - change line Ersetzen des Eingabepuffers durch die nachfolgende Zeile. Der Eingabepuffer wird dann ausgegeben. Mehrere Zeilen können wie bei a\ ersetzt werden. Beispiel: /bin/sed '/^#/c\ #-----------hier war ein Kommentar---------------# ' d2 b11,b12 |
next | back | 2017 - 12 | Fri Apr 7 14:46:39 CEST 2017 |
i\ - insert line Einfügen von nachfolgenden Zeilen vor der aktuellen Zeile aus dem Eingabepuffer. Beispiel: /bin/sed '/^#/i\ #--------es folgt ein Kommentar-------------#' d2 b13,b14 d - delete line Löschen einer Zeile aus dem Eingabepuffer. Die Arbeit wird bei der nächsten Zeile am Beginn des sed-Scripts fortgesetzt. Beispiel: /bin/sed '/^#/d' d2 b15 n - next line Ausgabe des Eingbepuffers. Einlesen der nächsten Zeile und fortsetzen des Scriptes an der aktuellen Position. Beispiel: /bin/sed -e '/^#/n' -e '/^#/d' b16 b16 |
next | back | 2017 - 13 | Fri Apr 7 14:46:39 CEST 2017 |
Ersetzungskommandos ------------------- s/<regulärer Ausdruck>/<String>/[<flag>] - substitute Ersetzen eines regulären Ausdrucks durch einen String. <flag> - g - global - ersetzen aller möglichen Teilstrings p - print - Ausgabe des Eingabepuffers, falls eine Ersetzung stattfand w <file> - write - Ausgabe des Eingabepuffers, falls eine Ersetzung stattfand in das File <file> Beispiel: /bin/sed -e 's/o.$/xxxxxx/' -e '/^#/d' d2 b17 y/<String1>/<String2>/ - translate Ersetzen der in <String1> vorkommenden Zeichen durch die an der entsprechenden Position in <String2> vorkommenden Zeichen. <String1> und <String2> müssen gleich lang sein. Beispiel: /bin/sed -e 's/äiou/AEIOU/' -e '/^#/d' d2 b18 |
next | back | 2017 - 14 | Fri Apr 7 14:46:39 CEST 2017 |
E/A-Kommandos ------------- p - print Ausgabe des Eingabepuffers. Diese Operation findet zu dem Zeitpunkt statt, zu dem das p-Kommando im sed-Script steht. Die bis dahin durchgeführten Veränderungen am Ausgabepuffer werden mit ausgegeben. Beispiel: /bin/sed -e /^#/d -e 'y/äiou/AEIOU/' \ -e p \ -e 'y/bcdfghjklmnpqrstvwxyz/BCDFGHJKLMNPQRSTVWXYZ/' d2 b19 l - list Ausgabe des Eingabepuffers. Dabei werden nicht druckbare Zeichen als ASCII-Werte (drei Oktalziffern mit vorangestelltem "\") oder, wenn möglich, in C-Notation ausgegeben. Überlange Zeilen werden in mehrere Zeilen zerlegt. Für das Zeilenende wird ein "$" ausgegeben. Beispiel: /bin/sed -n -e l d5 # nicht druckbare Zeichen werden # sichtbar b20 |
next | back | 2017 - 15 | Fri Apr 7 14:46:39 CEST 2017 |
r <file> - read Weiterbearbeiten der aktuellen Eingabepuffers. Ausgabe der fertigen Eingabepuffers. Lesen der Datei <file> und Ausgabe dieses Files. Achtung: Zwischen dem Buchstaben "r" und dem Filenamen steht genau ein Leerzeichen!!! Beispiel: /bin/sed -e '/worf/r d5' -e 's/orf/xxxxx/' d2 b21 w <file> - write to file Der aktuelle Eingabepuffer wird an die Datei <file> angehängt. Vor Beginn der Arbeit wird eine leere Datei <file> erzeugt. Nach dem w-Kommando darf kein weiteres Kommando folgen. Achtung: Zwischen dem Buchstaben "w" und dem Filenamen steht genau ein Leerzeichen!!! Beispiel: /bin/sed -e '/o/w d6' d2 b22 |
next | back | 2017 - 16 | Fri Apr 7 14:46:39 CEST 2017 |
Mehrzeilen-Kommandos -------------------- N - next line Die nächste Eingabezeile an Eingabepuffer angehängt. Das <NL>- Zeichen bleibt im Eingabepuffer erhalten. Nachfolgende Kommandos können jetzt dieses <NL>-Zeichen ersetzen. Beispiel: /bin/sed -e '/-$/N' -e 's/-\n//' d7 Achtung: In diesem Beispiel können nie mehr als zwei Zeilen miteinander verbunden werden!! b23 D - delete first part of pattern Löschen des ersten Teils des Eingabepuffers bis zum <NL>- Zeichen. Danach wird das gesammte sed-Script noch einmal gestartet. Wenn kein <NL>-Zeichen im Eingabepuffer vorhanden ist entspricht dieses Kommando dem d-Kommando. Dieses Kommando macht nur in Verbindung mit dem N-Kommando sinn!!! |
next | back | 2017 - 17 | Fri Apr 7 14:46:39 CEST 2017 |
P - print Erster Teil des Eingabepuffers wird bis einschliesslich eines <NL>-Zeichens ausgegeben. Wenn kein <NL>-Zeichen im Eingabepuffer vorhanden ist entspricht dieses Kommando dem p-Kommando. Beispiel: /bin/sed -f s24 d8 s24: /Raum/P /Raum/D N N N s/[12] [a-zA-Z][a-zA-Z]*//g s/\([34]\) \([a-zA-Z]\)/\2/g s/\n/ /g s/^/ / P D b24 |
next | back | 2017 - 18 | Fri Apr 7 14:46:39 CEST 2017 |
Kommandos für Zwischenspeicherung --------------------------------- Neben dem Eingabepuffer wird im sed auch noch ein Zwischenspeicher verwaltet. Zwischen Eingabepuffer und Zwischenpuffer können Daten hin und her transportiert werden. g - Eingabepuffer wird durch Zwischenspeicher überschrieben h - Zwischenspeicher durch Eingabepuffer überschreiben Beispiel: /bin/sed -n -f s25 d9 s25: 1h 1d /^$/p /^$/d /#/g p b25 H - Inhalt des Eingabepuffers am Ende des Zwischspeichers anhängen, durch <NL> getrennt |
next | back | 2017 - 19 | Fri Apr 7 14:46:39 CEST 2017 |
G - Zwischenspeicher am Ende des Eingabepuffers anhängen, durch <NL> getrennt Beispiel: /bin/sed -n -f s26 d2 s26: /^$/p /^$/d /o/H /o/d $G p b26 x - exchange (austauschen Zwischenspeicher und Eingabepuffer) Beispiel: /bin/sed -n -f s27 d2 s27: 1h 1d /^$/p /^$/d /o/x p /#/x b27 |
next | back | 2017 - 20 | Fri Apr 7 14:46:39 CEST 2017 |
Kommandos für die Ablaufsteürung --------------------------------- :ma - label Definiert eine Sprungmarke für die Kommandos b und t. Eine Marke ist ein normaler Bezeichner. Beispiel: :marke :Ende b <label> - branch Sprung zur Marke <label>. Zwischen dem b-Kommando und der Marke muss ein Leerzeichen stehen. Beispiel: /bin/sed -n -f s28 d2 s28: /worf/b ENDE /o/d :ENDE p b28 |
next | back | 2017 - 21 | Fri Apr 7 14:46:39 CEST 2017 |
t <label> - test and jump Bedingter Sprung im sed-Script. Falls nach dem Einlesen in den Eingabepuffer bzw. nach dem letzten t-Kommando eine Substitution stattgefunden hat wird ein Sprung zur angegebenen Marke <label> ausgeführt. Beispiel: /bin/sed -n -f s29 d2 s29: :Start /o/s/o/XXX/ t Start p b29 !<Kommando> - Verneinung der Adressangabe Wenn die Vorangestellte Adressangabe zutrifft, wird das nachfolgende Kommando <Kommando> nicht ausgeführt. Beispiel: /bin/sed -n -e '/worf/!s/o/XXX/' -e p d2 b30 |
next | back | 2017 - 22 | Fri Apr 7 14:46:39 CEST 2017 |
{ .. } - Klammerung von Kommandos Hierdurch können Kommandos zu Gruppen zusammengefasst werden, die nur ausgeführt werden, wenn die vorangestellte Adressangabe passt. Beispiel: /bin/sed -n -f s31 d2 s31: /o/{ s/r/R/g s/c/C/g } p b31 |
next | back | 2017 - 23 | Fri Apr 7 14:46:39 CEST 2017 |
Sonstige Kommandos ------------------ q - quit Beenden des Streameditors. Der aktuelle Eingabepuffer wird ausgegeben und der Streameditor wird beendet. Beispiel: /bin/sed -e '3q' d2 b32 = - Ausgabe der Zeilennummer als eigene Zeile /bin/sed -e '=' d2 b33 # - Kommentar Zeilen, die mit # beginnen werden als Kommentar gewertet. |
back | 2017 - 24 | Fri Apr 7 14:46:39 CEST 2017 |