LPIC101/103.4 Ströme, Pipes und Umleitungen verwenden: Unterschied zwischen den Versionen
Ramez (Diskussion | Beiträge) |
|||
(34 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
=Allgemeines= | =Allgemeines= | ||
*Manchmal | * 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 | * In diesem Fall können Sie eine sogenannte Pipe(senkrechter Strich) verwenden. | ||
*Mit | * 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 | * 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). | * In diesem Fall benötigen Sie eine Umleitung der Standardausgabe (Redirect). | ||
*Wenn | * 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 | * Diesmal mussallerdings die Standardeingabe umgeleitet (Redirect) werden | ||
== stdin, stdout und stderr | ==stdin, stdout und stderr== | ||
[[Datei:stdin-stdout-stderr.png|250px|thumb|right|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 | $ 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. | |||
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: | |||
$/diag # grep kernel /var/log/syslog > kernelmessages | |||
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. | |||
Sie können mit einer Kommandozeile wie der folgenden Standard meldungen und Fehlermeldungen in zwei unterschiedlichen Dateien aufzeichnen: | |||
$/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: | |||
$/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. | |||
<code>1>2>&1leitet</code> stderr auf stdoutum. | |||
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. | |||
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>). | |||
$/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: | |||
$/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: | |||
$/ # mail -s "Überprüfen!" willi < /var/log/syslog | |||
== Pipes == | |||
[[Datei:pipe.gif|350px|thumb|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.<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: | |||
$/ # 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: | |||
$/ # grep "kernel" /var/log/syslog | less | |||
Eine Kombination aus Umleitungen und Pipes verwendet z. B. üblicherweise das Programm tr. Das liegt daran,dass tr weder eine Eingabedatei noch eine Ausgabedatei103GNU- und Unix-Kommandos134 | |||
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 die | |||
entsprechende Zieldatei: | |||
$/textfiles # cat textfile1 | tr \n \r > textfile2 | |||
== tee und xargs == | |||
Mit tee kann der Datenstrom eines Programms gleichzeitig auf der Konsole und in einer Textdatei ausgegeben werden. Beispiel: | |||
$/ # 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: | |||
$/ # 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.<br> | |||
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. | |||
== | = Kontrollfragen= | ||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
'''Was machen pips?''' | |||
<div class="mw-collapsible-content">die Ausgabe eines Programms direkt als Eingabe für ein anderes Programm verwen | |||
det werden kann</div> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
'''Was ist der unterschid zwischen stdin, stdout und stderr?''' | |||
<div class="mw-collapsible-content">'''stidin ist Eingabe,stdout und stderr Ausgabe '''</div> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
''Testfrage 3'' | |||
<div class="mw-collapsible-content">'''keine'''</div> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
''Testfrage 4'' | |||
<div class="mw-collapsible-content">'''keine'''</div> | |||
</div> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
'''Was konnen wir machen mit tee und xargs?''' | |||
<div class="mw-collapsible-content">Mit tee kann der Datenstrom eines Programms gleichzeitig auf der Konsole und in einer Textdatei ausgegeben werden. | |||
</div> | |||
</div> | |||
[[Kategorie:Linux/LPIC/101]] | |||
[[ | |||
Aktuelle Version vom 23. Juni 2023, 19:25 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
Ü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:
$/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:
$/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:
$/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 (>>
).
$/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:
$/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:
$/ # mail -s "Überprüfen!" willi < /var/log/syslog
Pipes
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:
$/ # 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:
$/ # grep "kernel" /var/log/syslog | less
Eine Kombination aus Umleitungen und Pipes verwendet z. B. üblicherweise das Programm tr. Das liegt daran,dass tr weder eine Eingabedatei noch eine Ausgabedatei103GNU- und Unix-Kommandos134 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 die entsprechende Zieldatei:
$/textfiles # cat textfile1 | tr \n \r > textfile2
tee und xargs
Mit tee kann der Datenstrom eines Programms gleichzeitig auf der Konsole und in einer Textdatei ausgegeben werden. Beispiel:
$/ # 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:
$/ # 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.
Kontrollfragen
Was machen pips?
Was ist der unterschid zwischen stdin, stdout und stderr?
Testfrage 3
Testfrage 4
Was konnen wir machen mit tee und xargs?