Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


admin_grundlagen:pipes_und_umleitungen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
admin_grundlagen:pipes_und_umleitungen [2012/10/12 16:16]
ingo_wichmann
admin_grundlagen:pipes_und_umleitungen [2022/11/21 14:32] (aktuell)
ingo_wichmann [Kanäle]
Zeile 1: Zeile 1:
 +====== Kanäle ======
 +Datei ''​ausgabe.txt''​ mit Standard-Ausgabe des Befehls ''​ls -la''​ überschreiben:​
 +  ls -la > ausgabe.txt
 +  cat ausgabe.txt
 +-> Länge der Datei ''​ausgabe.txt''​ beachten!
 +
 +Standard-Ausgabe des Befehls ''​date''​ an Datei ''​ausgabe.txt''​ anhängen:
 +  date >> ausgabe.txt
 +  cat ausgabe.txt
 +
 +Standard-Eingabe:​
 +  wc -l ausgabe.txt
 +  wc -l < ausgabe.txt
 +  wc -l /etc/shadow
 +  wc -l < /etc/shadow
 +
 +Datei ''​fehler.txt''​ mit Fehlerausgabe des Befehls ''​ls gibtsnicht''​ überschreiben:​
 +  ls gibtsnicht 2> fehler.txt
 +
 +Fehlerausgabe des Befehls ​ ''​ls gibtsnicht''​ an Datei ''​fehler.txt''​ anhängen:
 +  ls gibtsnicht 2>> fehler.txt
 +
 +  ls . gibtsnicht 2> fehler.txt
 +  ls . gibtsnicht > ausgabe.txt
 +  ls . gibtsnicht >& beides.txt
 +  ls . gibtsnicht > beides.txt 2>&1
 +  ​
 +
 +
 +====== Pipes ======
 +Beispiele:
 +
 +  dpkg -l | wc -l
 +  dpkg -l | tee pakete.txt | less
 +
 +Doku: 
 +  * [[wpde>​Pipe (Informatik)]]
 +  * [[https://​www.moritz.systems/​blog/​mastering-unix-pipes-part-1/​|detaillierte,​ technische Beschreibung,​ wie Pipes implementiert sind]]
 +====== Filterbefehle ======
 +===== cat, tac & split =====
 +
 +Tabelle 8.2 im Skript
 +
 +  tar cz --directory /usr/share doc/ | split -b 10M - doc.tar.
 +  cat doc.tar.a* | tar tz | tail
 +
 +Benutzerliste rückwärts und mit Zeilennummern ;-)
 +  tac /etc/passwd
 +  cat -n /etc/passwd
 +===== head & tail =====
 +  head -n 20 /​etc/​services
 +  tail -n 20 /​etc/​services
 +Kapitel 8.3.2 im Skript lesen
 +
 +Übungen 8.8 - 8.11 im Skript
 +
 +===== od =====
 +  echo '​Müller'​ | od -a
 +
 +===== cut =====
 +  cut -d: -f 7 /etc/passwd
 +
 +===== sort =====
 +Tabelle 8.10 im Skript
 +
 +Übungen 8.22, 8.23, 8.26 im Skript
 +
 +===== uniq =====
 +
 +  find /​usr/​share/​doc -printf '​%y\n'​ | sort | uniq -c
 +  ​
 +===== grep =====
 +  cat /etc/passwd | grep bash
 +((
 +Moderne Alternativen:​
 +  * [[https://​packages.debian.org/​source/​sid/​rust-ripgrep|ripgrep]]
 +  * [[https://​packages.debian.org/​source/​bullseye/​ugrep|ugrep]]
 +))
 +
 +{{:​linux_grundlagen:​pasted:​20220310-151508.png}}
 +===== column =====
 +  column -t /etc/fstab
 +  ip -o link | column -t
 +  ip -o address | column -t
 +  column -s: -t /etc/passwd
 +
 +===== Pipeline =====
 +Statistik aller eingegebenen Befehle
 +  history | tr -s "​[[:​space:​]]"​ | cut -d" " -f 3- | sort | uniq -c| sort -nr
 +
 +====== Übung ======
 +
 +Wer errät, wofür dieser Befehl gut ist? (( https://​massimo-nazaria.github.io/​blog/​2019/​03/​02/​unix-philosophy-with-an-example.html ))
 +  seq 1 6 | shuf | head -n 1
 +
 +
 +
 ===== Vorbereitung des Beispiels ===== ===== Vorbereitung des Beispiels =====
 Testdaten ins Heimatverzeichnis kopieren: Testdaten ins Heimatverzeichnis kopieren:
Zeile 5: Zeile 102:
  
 ===== Ausgabe eines Befehls in Datei umleiten ===== ===== Ausgabe eines Befehls in Datei umleiten =====
-jpg-Bilder in suchen und Ergebnis in ''​bilder.txt''​ speichern:​ +jpg-Bilder in ''​doc'' ​suchen und Ergebnis in ''​bilder.txt''​ speichern:​ 
-  find / -xdev -name "​*.jpg"​ > /​tmp/​bilder.txt+  find doc/ -xdev -name "​*.jpg"​ > /​tmp/​bilder.txt
  
 Das Selbe, aber Fehlermeldungen unterdrücken:​ Das Selbe, aber Fehlermeldungen unterdrücken:​
-  find / -xdev -name "​*.jpg"​ > /​tmp/​bilder.txt 2> /dev/null+  find doc/ -xdev -name "​*.jpg"​ > /​tmp/​bilder.txt 2> /dev/null
  
 ===== Dateiinhalt mit Befehl weiterverarbeiten ===== ===== Dateiinhalt mit Befehl weiterverarbeiten =====
-Änderungszeit ​der in der Datei ''​bilder.txt''​ aufgeführten Dateien mit ''​touch''​ ändern: +Berechtigung ​der in der Datei ''​bilder.txt''​ aufgeführten Dateien mit ''​chmod''​ ändern: 
-  xargs touch < /​tmp/​bilder.txt +  xargs chmod g+w < /​tmp/​bilder.txt 
 +''​xargs''​ liest die (durch ein Zeilenende ''​\n''​ getrennten) Dateinamen (ggf. mit Pfad) aus der Standardeingabe und hängt diese als Liste an das Kommando (hier ''​chmod g+w''​) an.
 ===== Ausgabe eines Befehls mit zweitem Befehl weiterverarbeiten ===== ===== Ausgabe eines Befehls mit zweitem Befehl weiterverarbeiten =====
-jpg-Bilder in suchen und Änderungszeit ​mit ''​touch''​ ändern: +jpg-Bilder in ''​doc'' ​suchen und Berechtigung ​mit ''​chmod''​ ändern: 
-  find / -xdev -name "​*.jpg"​ 2> /dev/null | xargs touch+  find doc/ -xdev -name "​*.jpg"​ 2> /dev/null | xargs chmod g-w
  
 Verbesserte Version, die auch mit Leer- und Sonderzeichen in Dateinamen klar kommt: Verbesserte Version, die auch mit Leer- und Sonderzeichen in Dateinamen klar kommt:
-  find Eigene\ Dateien-type f -print0 | xargs -0 chmod a-x+  ​mv doc '​Eigene Dateien'​ 
 +  ​find Eigene\ Dateien -xdev -name "​*.jpg" ​-print0 ​2> /​dev/​null ​| xargs -0 chmod g+w 
 +  mv Eigene\ Dateien doc
  
 +Alle JPEG-Grafikdateien in das Verzeichnis Bilder kopieren:
 +  find / -name "​*jpg"​ -exec cp {} Bilder/ \; 2>/​dev/​null
 +Hier führt ''​find''​ für jede gefundene Datei das Kommando ''​cp''​ aus. Bei sehr vielen Dateien kann das sehr langsam werden.
 +  find / -name "​*jpg"​ -print0 2> /dev/null | xargs -0 cp -t Bilder
 +Hier schreibt ''​find''​ die gefundenen Namen durch ein Nullbyte ''​\0''​ getrennt in die Pipe, aus der ''​xargs''​ liest. Durch die Option ''​-0''​ erwartet ''​xargs'',​ dass die Dateinamen nicht durch ein Zeilenende (''​\n''​),​ sondern durch ein Nullbyte getrennt sind. ''​xargs''​ baut für ''​cp''​ eine lange Parameterliste aus Dateinamen zusammen und übergibt sie. Falls mehr Namen ankommen als auf eine Kommandozeile passen, wird ''​cp''​ ggf. mehrfach aufgerufen, aber viel seltener als im vorigen Beispiel. ​
 +
 +Weil ''​cp''​ üblicherweise das Ziel als letzten Parameter erwartet, muss hier die Option ''​-t''​ verwendet werden, um das Zielverzeichnis zu Beginn anzugeben. ​
 +  ​
 +Eine Variante ohne ''​xargs''​ und ohne das ''​cp''​-Kommando für jede gefundene Datei aufzurufen:
 +  find / -name "​*jpg"​ -exec cp -t Bilder/ {} + 2>/​dev/​null
 +Das ''​+''​-Zeichen braucht nicht geschützt zu werden. Es werden ganz viele Dateinamen am Ende des Kommandos anstelle des ''​{}''​ eingefügt. ​
 ===== Fehlerausgabe und Standardausgabe zusammenfassen ===== ===== Fehlerausgabe und Standardausgabe zusammenfassen =====
 Lange Version, geht auch mit anderen Shells als bash: Lange Version, geht auch mit anderen Shells als bash:
-  find / -xdev -name "*.au" > /​tmp/​bilder.txt 2>&​1 ​+  find doc/ -xdev -name "*.jpg" > /​tmp/​bilder.txt 2>&​1 ​
  
 Nur mit bash: Nur mit bash:
-  find / -xdev -name "*.au" &> /​tmp/​bilder.txt+  find doc/ -xdev -name "*.jpg" &> /​tmp/​bilder.txt
  
 +===== Fehlerausgabe und Standardausgabe mit zweitem Befehl weiterverarbeiten =====
 +  find /var -xdev -type d -ls 2>&1 | less
 +
 +Nur mit bash:
 +  find /var -xdev -type d -ls |& less
  
  
Zeile 36: Zeile 151:
   wc -l ausgabe1 ausgabe2   wc -l ausgabe1 ausgabe2
  
 +Sonderfall: stdout und stderr unterschiedlich weiterverarbeiten
 +  ((ls -l null eins |nl) 3>&1 1>&2 2>&3 | grep -v '​spezielle fehlermeldung'​ ) 3>&1 1>&2 2>&3
 +Es werden dazu stdout und stderr zweimal reihum getauschst.
 ====== Links ====== ====== Links ======
   * http://​www.tldp.org/​LDP/​abs/​html/​io-redirection.html   * http://​www.tldp.org/​LDP/​abs/​html/​io-redirection.html
  
admin_grundlagen/pipes_und_umleitungen.1350058574.txt.gz · Zuletzt geändert: 2012/10/12 16:16 von ingo_wichmann