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

Aus Foxwiki
Ramez (Diskussion | Beiträge)
Ramez (Diskussion | Beiträge)
Zeile 1: Zeile 1:


=Allgemeines=
=Allgemeines=
*Manchmal  kann  es  vorkommen,  dass  Sie  die  Ausgabe  eines  Programms  direkt  mit einem anderen Programm weiterverarbeiten müssen.
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.
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.
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  ==
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


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


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


* stdin: Über die Standardeingabe können Daten in ein Programmelesen werden.
'''stdin:''' Über die Standardeingabe können Daten in ein Programmelesen werden.
  $ less < eingaben.txt
  $ less < eingaben.txt
*stdout Über die Standardausgabe kann ein Programm Daten ausgeben Beispiel:
'''stdout:''' Über die Standardausgabe kann ein Programm Daten ausgeben Beispiel:
  $ find . -name '*.html' > ausgaben.txt
  $ find . -name '*.html' > ausgaben.txt
gleichbedeutend:
gleichbedeutend:
  $ find . -name '*.html' 1> ausgaben.txt
  $ find . -name '*.html' 1> ausgaben.txt
*stderr:Die Standardfehlerausgabe ist ein zweiter Ausgabedatenstrom, der dazu gedacht ist, Fehler- und Statusmeldungen auszugeben.
'''stderr:''' Die Standardfehlerausgabe ist ein zweiter Ausgabedatenstrom, der dazu gedacht ist, Fehler- und Statusmeldungen auszugeben.
*Normalerweise ist er ebenfalls mit dem Monitor verbunden; allerdings kann er getrennt von der Standardausgabe umgeleitet werden, so dass Fehlermeldungen nicht mit den ausgegebenen Nutzdaten vermischt werden.
Normalerweise ist er ebenfalls mit dem Monitor verbunden; allerdings kann er getrennt von der Standardausgabe umgeleitet werden, so dass Fehlermeldungen nicht mit den ausgegebenen Nutzdaten vermischt werden.
*Beispiel : Hier werden die Fehlermeldungen des Programms find in die Datei fehlermeldungen.txt umgeleitet, während die Standardausgabe über eine Pipe an das Programm less weitergeleitet wird.  
Beispiel : Hier werden die Fehlermeldungen des Programms find in die Datei fehlermeldungen.txt umgeleitet, während die Standardausgabe über eine Pipe an das Programm less weitergeleitet wird.  
 
  $ find . -name '*.html' 2> fehlermeldungen.txt | less
  $ find . -name '*.html' 2> fehlermeldungen.txt | less


==Beispiel==
=Umleitungen (Redirects)=
 
Umleitungen  werden  verwendet,  um  die  Standard-I/Os  entweder  in  eine  Datei  hinein  oder  aus  einer  Datei  heraus um zu lenken.
*Befehle haben einen Eingang (STDIN) und zwei Arten von Ausgängen.
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:
* Standardausgang (STDOUT) und Standardfehler (STDERR).
 
Zum Beispiel:
 
STDIN
 
root@server~# read
 
*Standardfehler werden (wie der Name schon sagt) für Fehlermeldungen verwendet. Da es sich bei dieser Nachricht nicht um eine Liste von Dateien handelt, wird sie an STDERR gesendet.
 
STDIN, STDOUT und STDERR sind die drei Standardströme. Sie sind in der Shell durch eine Nummer und nicht durch einen Namen gekennzeichnet:
 
0 = Standard in
1 = Standard aus
2 = Standardfehler
 
Standardmäßig ist STDIN an die Tastatur angeschlossen, und STDOUT und STDERR werden im Terminal angezeigt.
* Wir können jedoch entweder STDOUT oder STDERR an das weiterleiten, was wir brauchen.
*Nehmen wir zum Beispiel an, dass Sie nur den Standard out benötigen und alle Fehlermeldungen, die auf dem Standardfehler gedruckt werden, unterdrückt werden sollen. Dann verwenden wir die Deskriptoren 1 und 2 .
 
*Umleitung von STDERR nach / dev / null
 
Nehmen wir das vorige Beispiel
 
root@server~# ls anotherfile 2>/dev/null
 
*In diesem Fall wird ein STDERR an / dev / null weitergeleitet (eine spezielle Datei, die alle darin enthaltenen Einträge ignoriert), so dass keine Fehlerausgabe in der Shell erfolgt.
 
==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
  archangel:/diag # grep kernel /var/log/syslog > kernelmessages


*Mit einem solchen Kommando erfassen Sie nur die Standardausgabe von <code>grep</code> .
Mit einem solchen Kommando erfassen Sie nur die Standardausgabe von <code>grep</code> .
*Tritt ein  Fehler  auf, werden  die  entsprechenden Meldungen  weiterhin  auf  der  Konsole ausgegeben.
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:
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
  archangel:/scripts # script-xy 2>fehler.log 1>erfolg.log


*Hierbei  lenken  das  Argument, <code>1>erfolg.log</code> die  normalen  Meldungen  des  Programms und <code>1>erfolg.log</code>  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:
Hierbei  lenken  das  Argument, <code>1>erfolg.log</code> die  normalen  Meldungen  des  Programms und <code>1>erfolg.log</code>  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
  archangel:/scripts # script-xy >protokolldatei 2>&1


*Der  erste  Teil  des  Kommandos i <code>1>script-xy>protokolldate</code> sorgt  für  die  Umleitung von stdout in die Textdatei.
Der  erste  Teil  des  Kommandos i <code>1>script-xy>protokolldate</code> sorgt  für  die  Umleitung von stdout in die Textdatei.
*<code>1>2>&1leitet</code> stderr auf stdoutum.
<code>1>2>&1leitet</code> stderr auf stdoutum.
*Das <code>&</code> besagt, dass <code>1</code> keine Datei  ist.
Das <code>&</code> besagt, dass <code>1</code> keine Datei  ist.
*Das  Kommando  würde  ohne  das <code>&</code>  Standardfehlerkanal  in  die  Datei <code>1</code> umleiten.
Das  Kommando  würde  ohne  das <code>&</code>  Standardfehlerkanal  in  die  Datei <code>1</code> umleiten.
*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.
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 (<code>>></code>).
Um Daten an eine bestehende Dateianzuhängen, die für Umleitungen verwendet wird, müssen Sie einfach zwei Redirektor zeichen verwenden (<code>>></code>).


  archangel:/diag # grep kernel /var/log/syslog >> kernelmessages
  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.
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.
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:
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
  archangel:/db # grep "Meier" kunden-db > kunden-db


*Es besteht aber auch die Möglichkeit, den Standardeingabekanal umzuleiten.
Es besteht aber auch die Möglichkeit, den Standardeingabekanal umzuleiten.
*Beliebt hierfür ist das Programm mail.
Beliebt hierfür ist das Programm mail.
*Das folgende Kommando sendet den kompletten Sys-log per Mail an einen kompetenten Mitarbeiter.
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:
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
archangel:/ # mail -s "Überprüfen!" willi < /var/log/syslog


== Pipes ==
= Pipes =


[[Datei:pipe.gif|350px|thumb|PIPE]]  
[[Datei:pipe.gif|350px|thumb|PIPE]]  


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


== tee und xargs: ==
= tee und xargs =


*Mit tee kann  der  Datenstrom  eines  Programms gleichzeitig auf der Konsole und in einer Textdatei ausgegeben werden. Beispiel:
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
  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:
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 |\
  archangel:/ # cut -d " " -f1 /var/log/apache2/access.log |\
  sort | uniq | xargs -n1 host
  sort | uniq | xargs -n1 host
*Das Kommando wurde der Übersichtlichkeit halber mit dem Backslash auf zwei Zeilen aufgeteilt.
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.
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.
Diese Spalte enthält die IP-Adressen der Besucher.
*Das Kommando sort sortiert die Liste der IP-Adressen. Mit uniq wird dafür gesorgt, dass jede IP-Adresse nur einmal in der Liste auftaucht.
Das Kommando sort sortiert die Liste der IP-Adressen. Mit uniq 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  übergeben werden, weil host nur ein einzelnes Argument erwartet.
Diese Liste  kann  nicht  direkt  an  das  Kommando host zur  Namensauflösung  übergeben werden, weil host nur ein einzelnes Argument erwartet.
*Deshalb übergibt xargs die IP-Adressen einzeln. Das Kommando host wird also durch xargsfür jede IP-Adresse einmal aufgerufen
Deshalb übergibt xargs die IP-Adressen einzeln. Das Kommando host wird also durch xargsfür jede IP-Adresse einmal aufgerufen.


[[category:Linux:LPIC:101]]
[[category:Linux:LPIC:101]]
[[ Category : Linux ]]
[[ Category : Linux ]]

Version vom 19. November 2019, 09:58 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 Programmelesen werden.

$ less < eingaben.txt

stdout: Über die Standardausgabe kann ein Programm Daten ausgeben Beispiel:

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

gleichbedeutend:

$ 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; allerdings kann er getrennt von der Standardausgabe umgeleitet werden, so dass Fehlermeldungen nicht mit den ausgegebenen Nutzdaten vermischt werden. Beispiel : Hier werden die Fehlermeldungen des Programms find in die Datei fehlermeldungen.txt umgeleitet, während die Standardausgabe über eine Pipe an das Programm less weitergeleitet wird.

$ 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 1>erfolg.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 i 1>script-xy>protokolldate sorgt für die Umleitung von stdout in die Textdatei. 1>2>&1leitet stderr auf stdoutum. Das & besagt, dass 1 keine Datei ist. Das Kommando würde ohne das & Standardfehlerkanal in die Datei 1 umleiten. 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

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

Pipes

PIPE

Im Gegensatz zu Umleitungen lenken Pipes Datenströme nicht in Dateien um oderaus Dateien heraus. Sie sorgen vielmehr dafür, dass die Ausgabe eines Programms direkt als Eingabe für ein anderes Programm verwendet werden kann.

Die Ausgabe des ersten Programms erfolgt dann nicht nach stdout.Oft werden Umleitungen und Pipes auch miteinander kombiniert. Sehr gebräuchlich ist die Umlenkung grösserer Textmengen nach less. Das folgende Kommando würde möglicherweise eine solche größere Textmenge verursachen:

tee und xargs

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. Mit uniq 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 übergeben werden, weil host nur ein einzelnes Argument erwartet. Deshalb übergibt xargs die IP-Adressen einzeln. Das Kommando host wird also durch xargsfür jede IP-Adresse einmal aufgerufen.