AA_computer.jpg

Einführung in die Shell – Teil 3

Starke Argumente

In den ersten zwei Teilen der Shell-Einführung [1,2] haben wir Sie mit den Grundlagen der Shell vertraut gemacht. Jetzt stellen wir einige Spezialtools vor, mit denen die Shell besonders leistungsfähig wird – darunter "xargs".

In der letzten Ausgabe haben wir Ihnen am Ende des Guru-Trainings einen Befehl vorgestellt, mit dem Sie mehrere mit find gefundene PDF-Dateien gleichzeitig im Adobe Reader öffnen können – mit dem Versprechen, das genauer zu erklären. Der Befehl war:

find /tmp/ -name '*.pdf' -print0 | xargs -0 acroread

Er besteht aus zwei Kommandos, die über eine so genannte Pipe miteinander verbunden sind:

  • Das erste Kommando lautet find /tmp/ -name '*.pdf' -print0 und findet alle Dateien mit Endung .pdf, die im temporären Ordner /tmp/ oder einem seiner Unterverzeichnisse liegen. Die zusätzliche Option -print0 ist für den Zweck des anschließenden Adobe-Reader-Starts wichtig, denn Sie bewirkt, dass find in der Ausgabe nicht Leerzeichen oder Zeilenumbrüche, sondern ein spezielles Sonderzeichen zwischen die Dateinamen schreibt. Das hat den Vorteil, dass der gesamte Befehl auch dann funktioniert, wenn sich in einigen der Dateinamen Leerzeichen befinden.
  • Über das Pipe-Zeichen | wird die Ausgabe des ersten Kommandos (eine Liste von Dateinamen) zur Eingabe für das zweite Kommando. Es heißt xargs -0 acroread. Das Tool xargs ist besonders praktisch: Es wandelt Informationen aus der Standardeingabe in Argumente um. Die Wirkung können Sie leicht ausprobieren, indem Sie den Befehl ls / | xargs echo eingeben – ls / gibt den Inhalt des Wurzelverzeichnisses aus, und xargs macht aus dieser Ausgabe Argumente für den Befehl echo, der einfach seine Argumente ausgibt (siehe Kasten Ausgabe als Argumente). Die Option -0 (das ist eine Null, nicht der Großbuchstabe O) teilt xargs mit, dass es nicht normale Leerzeichen als Trenner für die verschiedenen Argumente interpretieren soll, sondern das Sonderzeichen, das find über die Option -print0 als Trenner eingefügt hat.

Die Regel ist: Wenn Sie find und xargs auf diese Weise kombinieren, müssen Sie entweder find mit der Option -print0 und xargs mit der Option -0 verwenden oder bei beiden Kommandos auf die Optionen verzichten – anderenfalls passen Ausgabe und Eingabe nicht zusammen, und xargs "versteht" Sie nicht.

Ausgabe als Argumente

Das folgende Kommando gibt den Inhalt des Wurzelverzeichnisses aus, setzt aber noch die Worte "Inhalt Wurzelverzeichnis:" vor die Ausgabe.

$ ls / | xargs echo "Inhalt Wurzelverzeichnis:"
Inhalt Wurzelverzeichnis: bin boot dev etc home lib lost+found media mnt opt proc root sbin srv sys tmp usr var

Das funktioniert in drei Schritten:

  • Das Kommando ls / listet den Inhalt des Wurzelverzeichnisses auf, gibt also z. B. bin boot dev etc home lib lost+found media mnt opt proc root sbin srv sys tmp usr var aus. Wenn Sie den Befehl alleine aufrufen, erscheinen diese Namen direkt in der Shell.
  • Über das Pipe-Zeichen reichen Sie die Ausgabe als Standardeingabe an das folgende Kommando weiter.
  • xargs echo "Inhalt Wurzelverzeichnis:" liest zunächst von der Standardeingabe. Es erhält dort die schon mehrfach gezeigte Liste von Verzeichnisnamen. Es baut dann ein neues Kommando zusammen, das sich aus echo "Inhalt Wurzelverzeichnis:" und der neuen Argumentliste zusammensetzt, so entsteht der Befehl echo "Inhalt Wurzelverzeichnis:" bin boot dev etc home lib lost+found media mnt opt proc root sbin srv sys tmp usr var. Diesen Befehl führt xargs dann aus.
  • Das Kommando echo weiß nichts von dem Umweg, auf dem es seine Argumente erhalten hat; es "sieht" einfach nur, dass es mit den Argumenten "Inhalt Wurzelverzeichnis:" bin boot dev etc home lib lost+found media mnt opt proc root sbin srv sys tmp usr var aufgerufen wurde, und gibt diesen Text aus.

Für Sammler: Umleitungen

Wollen Sie die Ausgabe eines Programms nicht (nur) im Terminalfenster sehen, sondern dauerhaft archivieren oder etwa für den Versand als E-Mail-Anhang in einer Datei sichern, nutzen Sie ein praktisches Feature der Shell: die Ausgabeumleitung. Dazu setzen Sie ganz am Schluss hinter das Kommando ein Größerzeichen (>) und einen Dateinamen: Die Ausgabe des Befehls landet in der Datei.

Jeder solche Aufruf mit > Dateiname löscht zunächst einen eventuell vorhandenen Inhalt der Datei und schreibt dann die Ausgabe hinein – so können Sie immer nur eine einzige Programmausgabe sichern. Soll eine Datei die Ergebnisse mehrerer Befehle enthalten, verwenden Sie statt > ein doppeltes Größer-Zeichen (>>): Dann hängt die Shell die Ausgabe an die Zieldatei an, ohne diese vorher zu leeren.

Beide Varianten können Sie auch kombinieren: Um etwa die Ausgaben von befehl1, befehl2 und befehl3 in der Datei /tmp/ausgaben.logzu protokollieren, geben Sie die Kommandos

befehl1 > /tmp/ausgaben.log
befehl2 >> /tmp/ausgaben.log
befehl3 >> /tmp/ausgaben.log

ein. Die erste Zeile sorgt über das einfache >-Zeichen zunächst dafür, dass die Zieldatei leer ist, bevor erste Informationen darin landen. Die zweiten und dritten Zeilen hängen dann die Ausgaben an die Datei an.

Beachten Sie, dass > und >> nur "normale" Ausgaben eines Befehls erfassen. Es gibt auch spezielle Fehlerausgaben, die aus Linux-Sicht über einen anderen "Kanal" laufen, die so genannte Standardfehlerausgabe (stderr). Entsprechend heißt die normale Ausgabe Standardausgabe (stdout). Erzeugt ein Programm neben den regulären Ausgaben auch Fehlermeldungen, bleiben diese weiterhin im Terminalfenster sichtbar und stehen nicht in der Zieldatei. Um auch die Fehler in der Datei zu protokollieren, passen Sie die Befehlszeile an und stellen vor das > bzw. >> ein kaufmännisches Und (&), insgesamt also: &> bzw. &>>. Liegt im aktuellen Arbeitsverzeichnis z. B. eine Datei mozilla.ps, aber keine Datei namens mozzzllla.ps, dann erzeugt der Befehl

ls -l mozilla.ps mozzzllla.ps &> /tmp/test.log

sowohl eine reguläre Ausgabe (Informationen über die Datei mozilla.ps) als auch eine Fehlerausgabe (über das Fehlen der anderen Datei). Beide Ausgaben landen nun dank der Umleitung mit &> in der Datei test.log, was Sie mit cat schnell überprüfen können:

esser@netbookhg:~$ cat /tmp/test.log
ls: Zugriff auf mozzzllla.ps nicht möglich: No such file or directory
-rw-r--r-- 1 esser esser 1482262 2010-02-07 00:22 mozilla.ps

Probieren Sie auch die Variante ohne das kaufmännische Und aus und vergleichen Sie die Ergebnisse.

Suchen und Ersetzen

Um in einer Datei konsequent das Wort "Apfel" durch "Birne" zu ersetzen, können Sie diese in einem Editor öffnen und dessen Ersetzenfunktion verwenden. Es geht aber auch auf der Shell, wenn Sie das Kommando sed verwenden. Dessen Syntax ist ein wenig gewöhnungsbedürftig, für einfache Aufgaben aber schnell gemeistert: Heißt Ihre Datei etwa test.txt, können Sie mit

sed -e s/Apfel/Birne/g test.txt > test2.txt

die Ersetzungen vornehmen. Die überarbeitete (Birnen-)Fassung landet dabei in der Datei test2.txt. Zur Erläuterung:

  • Die Option -e leitet einen Ausdruck (englisch: expression) ein, damit sagen Sie sed, was zu tun ist.
  • Der folgende Text s/Apfel/Birne/g ist ein solcher Ausdruck. Er beginnt mit einem Kommando (s, substitute = ersetzen), nach einem Schrägstrich folgt der zu ersetzende Begriff (Apfel), nach einem weiteren Schrägstrich der einzusetzende Text (Birne) und nach dem letzten Schrägstrich noch eine Option (g, global), welche dafür sorgt, dass sed auch mehrere Treffer in einer einzelnen Zeile ersetzt.
  • Es folgt als weiteres Argument der Name der Datei (test.txt),
  • und über die Umleitung > test2.txt schreiben Sie das Ergebnis der Ersetzung in die Datei test2.txt.

Dabei achtet sed genau auf die Unterschiede zwischen Groß- und Kleinschreibung – ein Vorkommen von "apfel" oder "aPFEL" würde das Kommando hier also ignorieren. Wortgrenzen spielen andererseits keine Rolle, aus "Apfelkompott" wird das grammatikalisch fehlerhafte "Birnekompott", weil eben in "Apfelkompott" der gesuchte Begriff "Apfel" vorkommt.

Um auch andere Schreibweisen ("apfel", "aPFEL" etc.) zu ersetzen, können Sie die zusätzliche Option i (ignore case, Groß-/Kleinschreibung ignorieren) verwenden, die Sie hinter der Option g ergänzen – der Befehl wird damit

sed -e s/Apfel/Birne/gi test.txt > test2.txt

Abbildung 1 zeigt eine Beispieldatei und das Produkt des obigen Kommandos, wobei die jeweiligen Vorkommen von "Apfel" oder "Birne" durch einen Aufruf von grep farblich hervorgehoben sind. Dort sehen Sie, dass sed nun unabhängig von Groß- und Kleinschreibung alle Äpfel im Text findet. Ersetzt wird dabei aber immer durch "Birne" in genau dieser Schreibweise – sed hätte keine Möglichkeit zu erahnen, dass Sie etwa "aPFEl" durch "bIRNe" ersetzen möchten.

Abbildung 1: Das Tool "sed" ersetzt Texte und kann auch Groß-/Kleinschreibung ignorieren.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Häppchenweise
    Sonderzeichen in Dateinamen bereiten vielen Shell-Tools Probleme. Mit Xargs umschiffen Sie die Hürden elegant.
  • Zu Befehl: Kanäle, Pipes und Tee
    Mit wenigen Handgriffen leiten Sie auf der Kommandozeile Ein- und Ausgaben von Befehlen um und kombinieren Kommandos. Wir stellen die benötigten Bash-Operatoren vor und zeigen, wie Sie mit dem Programm tee noch einen Zwischenschritt einlegen.
  • SuSE 9.3: YaST Installationsquellen erweitern, 4.4GB-32bit ISO erstellen und einbinden
  • Hilfreiche Spezialisten
    Die Werkzeuge der Linux-Shell sind oft hochspezialisiert: Einige von ihnen erledigen nur eine einzige Aufgabe, aber die beherrschen sie dann in Perfektion. Die Kombination mehrerer dieser kleinen Tools macht die Shell so leistungsfähig.
  • Datenbaustelle
    Die Linux-Kommandozeile zeigt ihre Stärken gerade beim Kombinieren vieler kleiner Tools – hier gilt der klassische Satz: Das Ganze ist mehr als die Summe seiner Teile. Umleitungen und Pipes sind oft mit am Werk, wenn Kommandos zusammenwirken.
Kommentare

Infos zur Publikation

EL 11/2017-01/2018: Einstieg in Linux

Digitale Ausgabe: Preis € 9,80
(inkl. 19% MwSt.)

EasyLinux erscheint vierteljährlich und kostet 9,80 Euro. Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 33,30 Euro. Details dazu finden Sie im Computec-Shop.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!      

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 2 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...