LPIC101/103.4 Ströme, Pipes und Umleitungen verwenden: Unterschied zwischen den Versionen

Aus Foxwiki
Ramez (Diskussion | Beiträge)
Ramez (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 11: Zeile 11:
==== stdin, stdout und stderr  ====
==== stdin, stdout und stderr  ====


 
[[Datei:stdin-stdout-stderr.png|250px|thumb|stdin, stdout und stderr]]  
[[Datei:pipe.gif|250px|thumb|Pipe]]  
 
 


* stdin: Über die Standardeingabe können Daten in ein Programm eiBeispiel.jpgngelesen werden.
* stdin: Über die Standardeingabe können Daten in ein Programm eiBeispiel.jpgngelesen werden.
Zeile 39: Zeile 36:


*Mit einem solchen Kommando erfassen Sie nur die Standardausgabe von grep.
*Mit einem solchen Kommando erfassen Sie nur die Standardausgabe von grep.
*Trittein Fehler  auf, werden  die  entsprechenden Meldungen  weiterhin  auf  der  Konsole
*Tritt ein Fehler  auf, werden  die  entsprechenden Meldungen  weiterhin  auf  der  Konsole
ausgegeben. Sie können mit einer Kommandozeile wie der folgenden Standardmel-dungen und Fehlermeldungen in zwei  
ausgegeben.
*Sie können mit einer Kommandozeile wie der folgenden Standard meldungen und Fehlermeldungen in zwei  
unterschiedlichen Dateien aufzeichnen:
unterschiedlichen Dateien aufzeichnen:


archangel:/scripts # script-xy 2>fehler.log 1>erfolg.log
archangel:/scripts # script-xy 2>fehler.log 1>erfolg.log


Hierbei  lenken  das  Argument   1>erfolg.log die  normalen   Meldungen  des  Pro-gramms und 2>fehler.log die Fehlermeldungen in je eine Datei um. Wenn nur eine
*Hierbei  lenken  das  Argument, 1>erfolg.log die  normalen Meldungen  des Programms und   2>fehler.log die Fehlermeldungen in je eine Datei um.
einzige Datei für die Aufzeichnung sowohl von stdout als auch stderr verwendet werden soll, können Sie auch ein Kommando wie das folgende verwenden:
*Wenn nur eine
*einzige Datei für die Aufzeichnung sowohl von stdout als auch stderr verwendet werden soll, können Sie auch ein Kommando wie das folgende verwenden:


archangel:/scripts # script-xy >protokolldatei 2>&1
archangel:/scripts # script-xy >protokolldatei 2>&1


Der  erste  Teil  des  Kommandos script-xy>protokolldatei sorgt  für  die  Umleitung von stdout
*Der  erste  Teil  des  Kommandos script-xy>protokolldatei sorgt  für  die  Umleitung von stdout
in die Textdatei. 2>&1leitet stderr auf stdoutum. Das & besagt, dass 1keine Datei  ist. Das  Kommando  würde  ohne  das  & den  Standardfehlerkanal  in  die  Datei 1umleiten.
in die Textdatei.
Wenn  Sie  einen  Standard-I/O  umleiten,  wird  die  Zieldatei,  wenn  diese  noch  nichtexistiert, automatisch erstellt. Sollten Sie dieselbe Umleitung noch einmal durchfüh-ren, wird die ursprüngliche Datei überschrieben. Um Daten an eine bestehende Datei
*2>&1leitet stderr auf stdoutum.
anzuhängen, die für Umleitungen verwendet wird, müssen Sie einfach zwei Redirektorzeichen verwenden (>>).
*Das & besagt, dass 1keine Datei  ist.
*Das  Kommando  würde  ohne  das  & den  Standardfehlerkanal  in  die  Datei 1umleiten.
*Wenn  Sie  einen  Standard-I/O  umleiten,  wird  die  Zieldatei,  wenn  diese  noch  nicht existiert, automatisch erstellt. *Sollten Sie dieselbe Umleitung noch einmal durchführen, wird die ursprüngliche Datei überschrieben.
*Um Daten an eine bestehende Dateianzuhängen, die für Umleitungen verwendet wird, müssen Sie einfach zwei Redirektor zeichen verwenden (>>).


archangel:/diag # grep kernel /var/log/syslog >> kernelmessages
archangel:/diag # grep kernel /var/log/syslog >> kernelmessages


Wenn Sie nur einen einzelne
*Wenn Sie nur einen einzelnen Redirektor verwenden, wird gleich zu Beginn der Programm ausführung die Zieldatei erstellt.
n Redirektor verwenden, wird gleich zu Beginn der Programm ausführung die Zieldatei erstellt. Ist diese bereits vorhanden, wird sie gelöscht
*Ist diese bereits vorhanden, wird sie gelöscht und neu erstellt.
und neu erstellt. Sollten also Zieldatei und  
*Sollten also Zieldatei und Eingabedatei identisch sein, ist ein Daten verlust garantiert. Das folgende Kommando hat demnach eine leere Kundendatenbank zur Folge:
Eingabedatei identisch sein, ist ein Daten verlust garantiert. Das folgende Kommando hat demnach eine leere Kundendatenbank zur Folge:


archangel:/db # grep "Meier" kunden-db > kunden-db
archangel:/db # grep "Meier" kunden-db > kunden-db

Version vom 13. November 2019, 11:05 Uhr

Allgemeines

  • Manchmal kann es vorkommen, dass Sie die Ausgabe eines Programms direkt mit einem anderen Programm weiterverarbeiten müssen.
  • In diesem Fall können Sie eine sogenannte Pipe(senkrechter Strich) verwenden.
  • Mit ihrer Hilfe ist das Zwischen-speichern der Ausgabe des ersten Programms in einer Datei zum Zweck,diese Datei dann mit dem zweiten Programm wieder einzulesen, unnötig.
  • In einem anderen Fall erzeugt ein Programm vielleicht eine Ausgabe auf dem Bild-schirm, die Sie abspeichern wollen.
  • In diesem Fall benötigen Sie eine Umleitung der Standardausgabe (Redirect).
  • Wenn ein Programm ausschließlich von der Standardeingabe (normalerweise dieTastatur) liest und Sie mit diesem Programm eine Datei einlesen müssen, benötigen Sie ebenfalls eine Umleitung.
  • Diesmal mussallerdings die Standardeingabe umgeleitet (Redirect) werden

stdin, stdout und stderr

stdin, stdout und stderr
  • stdin: Über die Standardeingabe können Daten in ein Programm eiBeispiel.jpgngelesen werden.
$ less < eingaben.txt
  • stdout

Über die Standardausgabe kann ein Programm Daten ausgeben Beispiel:

$ find . -name '*.html' > ausgaben.txt

file:///home/ramezalfarhat/Bilder/stdin-stdout-stderr.png

$ find . -name '*.html' 1> ausgaben.txt
  • stderr:

Die Standardfehlerausgabe ist ein zweiter Ausgabedatenstrom, der dazu gedacht ist, Fehler- und Statusmeldungen auszugeben. Normalerweise ist er ebenfalls mit dem Monitor verbunden

$ find . -name '*.html' 2> fehlermeldungen.txt | less

Umleitungen (Redirects)

  • Umleitungen werden verwendet, um die Standard-I/Os entweder in eine Datei hinein oder aus einer Datei heraus um zu lenken.
  • Wenn Sie alle Meldungen des Kernels in einer separaten Datei speichern möchten, können Sie mittels grep im Syslognach solchen Meldungen suchen und diese dann mit einem Redirektor in eine andere Datei speichern:
archangel:/diag # grep kernel /var/log/syslog > kernelmessages
  • Mit einem solchen Kommando erfassen Sie nur die Standardausgabe von grep.
  • Tritt ein Fehler auf, werden die entsprechenden Meldungen weiterhin auf der Konsole

ausgegeben.

  • Sie können mit einer Kommandozeile wie der folgenden Standard meldungen und Fehlermeldungen in zwei

unterschiedlichen Dateien aufzeichnen:

archangel:/scripts # script-xy 2>fehler.log 1>erfolg.log
  • Hierbei lenken das Argument, 1>erfolg.log die normalen Meldungen des Programms und 2>fehler.log die Fehlermeldungen in je eine Datei um.
  • Wenn nur eine
  • einzige Datei für die Aufzeichnung sowohl von stdout als auch stderr verwendet werden soll, können Sie auch ein Kommando wie das folgende verwenden:
archangel:/scripts # script-xy >protokolldatei 2>&1
  • Der erste Teil des Kommandos script-xy>protokolldatei sorgt für die Umleitung von stdout

in die Textdatei.

  • 2>&1leitet stderr auf stdoutum.
  • Das & besagt, dass 1keine Datei ist.
  • Das Kommando würde ohne das & den Standardfehlerkanal in die Datei 1umleiten.
  • Wenn Sie einen Standard-I/O umleiten, wird die Zieldatei, wenn diese noch nicht existiert, automatisch erstellt. *Sollten Sie dieselbe Umleitung noch einmal durchführen, wird die ursprüngliche Datei überschrieben.
  • Um Daten an eine bestehende Dateianzuhängen, die für Umleitungen verwendet wird, müssen Sie einfach zwei Redirektor zeichen verwenden (>>).
archangel:/diag # grep kernel /var/log/syslog >> kernelmessages
  • Wenn Sie nur einen einzelnen Redirektor verwenden, wird gleich zu Beginn der Programm ausführung die Zieldatei erstellt.
  • Ist diese bereits vorhanden, wird sie gelöscht und neu erstellt.
  • Sollten also Zieldatei und Eingabedatei identisch sein, ist ein Daten verlust garantiert. Das folgende Kommando hat demnach eine leere Kundendatenbank zur Folge:

archangel:/db # grep "Meier" kunden-db > kunden-db

103.4 Ströme, Pipes und Umleitungen verwenden 133 Es besteht aber auch die Möglichkeit, den Standardeingabekanal umzuleiten. Beliebt hierfür ist das Programm mail. Das folgende Kommando sendet den kompletten Sys-log per Mail an einen kompetenten Mitarbeiter. Der Betreff lautet »Überprüfen!« und der Inhalt der Datei erscheint im Textkörper der Mail:

archangel:/ # mail -s "Überprüfen!" willi < /var/log/syslog

Zusammenfassung:

  • Aufgezählter Listeneintrag Um die Standardausgabe umzulenken, verwenden Sie diese Syntax:

Kommando>Zieldatei(überschreibend) Kommando1>Zieldatei (überschreibend) Kommando>>Zieldatei(anhängend) Kommando1>>Zieldatei(anhängend)

  • Aufgezählter Listeneintrag Um den Standardfehlerkanal umzulenken, verwenden Sie:

Kommando2>Zieldatei(überschreibend) Kommando2>>Zieldatei (anhängend)

  • Aufgezählter Listeneintrag Um beide Ausgabekanäle umzulenken, verwenden Sie:

Kommando>Zieldatei2>&1(gemeinsame Zieldatei) Kommando1>ZieldateiA2>ZieldateiB(getrennte Zieldateien)

  • Aufgezählter Listeneintrag Um die Standardeingabe umzulenken, verwenden Sie diese Syntax:

Kommando<Quelldatei

Pipes

Anonyme Pipes: Pipes sind unter Unix und unixoiden Betriebssystemen eines der mächtigsten Werkzeuge, um die sequentielle Abarbeitung von Befehlen auf einem bestimmten Datenbestand zu ermöglichen.

Bei einer anonymen Pipe ist die Kommunikation dabei auf mehrere Prozesse gleichen Ursprungs beschränkt. Diese (Ursprungs-)Beziehung entsteht meistens durch Forks. In der Shell wird eine anonyme Pipe zum Startzeitpunkt der Programme durch Eingabe eines „|“-Zeichens erzeugt. Die Shell ist dann der (gemeinsame) Elternprozess aller Prozesse und erledigt die Forks automatisch.

Beispiel:

grep '.sshd.*Invalid user' /var/log/messages | awk '{print $NF}' | sort -u

Im Gegensatz zu Umleitungen lenken Pipes Datenströme nicht in Dateien um oderaus Dateien heraus. Sie sorgen vielmehr dafür, dass die Ausgabe eines Programmsdirekt als Eingabe für ein anderes Programm verwendet werden kann. Die Ausgabe des ersten Programms er folgt dann nicht nach stdout. Oft werden Umleitungen und Pipes auch miteinander kombiniert. Sehr gebräuchlich ist die Umlenkung größererm Textmengen nach less. Das folgende Kommando würde möglicherweise eine solche größere Textmenge verursachen:

archangel:/ # grep "kernel" /var/log/syslog

Damit Sie die Ausgabe des Kommandos überhaupt komplett lesen können, wird sie einfach mit einer Pipe an less weitergegeben:

archangel:/ # grep "kernel" /var/log/syslog | less

Eine Kombination aus Umleitungen und Pipes verwendet z. B. üblicherweise das Programmtr. Das liegt daran, dass tr weder eine Eingabedatei noch eine Ausgabedatei als Argument übergeben werden kann. Deshalb erfolgt die Eingabe oft mittels einer Pipe aus dem Programm cat heraus und die Ausgabe mit einer Umlenkung in dieentsprechende Zieldatei:

archangel:/textfiles # cat textfile1 | tr \n \r > textfile2

tee und xargs:

Das Programm tee hat nichts mit dem gleichnamigen aromatischen Aufgussgetränk zu tun, sondern eher mit einem T-Stück. Mit tee kann der Datenstrom eines Programms gleichzeitig auf der Konsole und in einer Textdatei ausgegeben werden. Beispiel:

archangel:/ # grep pppd /var/log/syslog | tee pppdmessages

Mit xargs können Sie die Ergebnisse eines Programms, das eine mehrzeilige Ausgabeliefert, an ein Programm übergeben, das immer nur ein Argument gleichzeitig verarbeiten kann. Beispiel:

archangel:/ # cut -d " " -f1 /var/log/apache2/access.log |\ sort | uniq | xargs -n1 host

Das Kommando wurde der Übersichtlichkeit halber mit dem Backslash auf zwei Zeilen aufgeteilt. Zur Erklärung: Mit diesem Kommando soll überprüft werden, von welchen Domänen aus auf einen Webserver zugegriffen wurde. Zunächst wird mit dem cut-Befehl die erste Spalte des access.log von Apache isoliert. Diese Spalte enthält die IP-Adressen der Besucher. Das Kommando sort sortiert die Liste der IP-Adressen. Mituniq wird dafür gesorgt, dass jede IP-Adresse nur einmal in der Liste auftaucht. Diese Liste kann nicht direkt an das Kommando host zur Namensauflösung übergebenwerden, weil host nur ein einzelnes Argument erwartet. Deshalb übergibt xargs die IP-Adressen einzeln. Das Kommando host wird also durch xargs für jede IP-Adresse einmal aufgerufen.