Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
admin_grundlagen:pipes_und_umleitungen [2020/12/04 14:11] holger_jakobs [Ausgabe eines Befehls mit zweitem Befehl weiterverarbeiten] |
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 30: | Zeile 127: | ||
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. | 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. ''xargs'' kann halt nur am Ende des Kommandos Parameter anfügen. | + | 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: |