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
Letzte Überarbeitung Beide Seiten, nächste Überarbeitung
admin_grundlagen:pipes_und_umleitungen [2012/10/12 16:16]
ingo_wichmann
admin_grundlagen:pipes_und_umleitungen [2022/11/21 14:17]
ingo_wichmann
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
 +  ​
 +
 +Übungen 8.2 - 8.4 im Skript
 +
 +====== 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 103:
  
 ===== 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 152:
   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.txt · Zuletzt geändert: 2022/11/21 14:32 von ingo_wichmann