PDF-Version
Transcription
PDF-Version
Foliensatz 5 Arbeiten mit der Bash Inhalt • Wie die Bash eine Eingabe verarbeitet • Befehle miteinander kombinieren • Ein- und Ausgabe umleiten • Auswertungsunterdrückung • Expansionen • Wichtige Hilfsprogramme Wie die Bash eine Eingabe verarbeitet • Der eingegebene Text wird in Wörter (auch Token genannt) durch die Meta-Zeichen | & ; ( ) < > space tab aufgeteilt, die Auswertungsunterdrückung wird dabei beachtet. • Die Wörter werden analysiert und zu einfachen bzw. komplexen Befehlen zusammengefasst. • Die verschiedenen Expansionen werden der Reihe nach durchgeführt. • Ein- und Ausgabeumleitungen werden angewandt. • Die einzelnen Befehle werden ausgeführt. Auf die einzelnen Teile dieser Verarbeitungsschritte werden wir jetzt näher eingehen. Bash Shortcuts • „Strg-l“ → Bildschirm löschen und Cursor in die erste Zeile setzen • „Strg-k“ → Vom Cursor bis zum Zeilenende alles ausschneiden • „Strg-y“ → Letzten ausgeschnitten Text einfügen • „Strg--“ → Letzte Eingabe rückgängig machen • „Strg-xx“ → Zwischen der aktuellen Position und dem Zeilenanfang hin- und herspringen • „Strg-x Strg-e“ → Aktuelle Befehlszeile im Editor öffnen und danach ausführen • „Alt-Strg-e“ → Eine Befehlszeile wie die Bash expandieren • „Alt-.“, „Alt-_“ → Letztes Wort der letzten Befehlszeile einfügen • „Strg-x~“ → Benutzernamenvervollständigung anzeigen Auswertungsunterdrückung (Quoting) • Die Auswertungsunterdrückung (Quoting) erlaubt es, die spezielle Bedeutung von Zeichen oder Wörtern zu unterdrückung. Spezielle Bedeutung haben z.B. die Zeichen | & ; ( ) < > space tab und Wörter der Form $WORT. Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 1 von 14 • Drei Möglichkeiten: • Maskierungszeichen \: Das Zeichen nach dem Maskierungszeichen behält seine ursprüngliche Bedeutung bei. Beispiele: • \\ → Zeichen \ • \n → Zeilenumbruch • \r → Cursor zurück zum Zeilenanfang bewegen • \ → Leerzeichen (z.B. in Dateinamen) • '...': Starkes Quoting; alles innerhalb von einfachen Anführungszeichen bleibt genau so erhalten. • "...": Schwaches Quoting; die Zeichen $, `, ! und \ behalten ihre spezielle Bedeutung (\ nur für $ ` ! "), alle anderen Zeichen bleiben erhalten. Auswertungsunterdrückung - Beispiele $ VAR=Hallo $ echo "$VAR\n$VAR" hallo\nhallo $ echo -e $VAR\\n$VAR hallo hallo $ echo '$VAR' $VAR $ echo -e "Hallo\rHe" Hello Befehle kombinieren • • Die bash-Shell erlaubt es, mehrere einfache Befehle auf unterschiedeliche Arten miteinander zu komplexen Befehlen zu kombinieren: • Pipelines (umleiten von Ausgabe und Eingabe) • Listen (verbinden von Befehlen mit Operatoren) • Verbundbefehle Ein einfacher Befehl besteht aus optionalen Variablenzuweisungen, Ein- und Ausgabeumleitungen und Wörtern. Das erste Wort gibt den auszuführenden Befehl an, die restlichen sind die Argumente. Das sieht z.B. so aus: $ X=Hallo ruby -e 'puts ENV["X"]' >test Dabei ist X=Hallo eine Variablenzuweisung, ruby der auszuführende Befehl, -e und puts ENV["X"] die Argumente und >test eine Ausgabeumleitung. • Am häufigsten werden bei der „normalen“ Arbeit mit der Shell wahrscheinlich die Pipelines verwendet. • Der Rückgabewert der Befehle spielt bei deren Kombination meist eine Rolle. Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 2 von 14 Pipelines • Pipelines verbinden die Ausgabe (stdout) eines Befehls mit der Eingabe (stdin) eines anderen Befehls. • Das Konzept geht auf die ersten Anfänge der elektronischen Datenverarbeitung zurück und wurde von Douglas McIlroy erfunden. • Die Ausgabe wird unmittelbar weitergegeben und das konkrete Verhalten hängt von den jeweiligen Befehlen ab. Jeder Befehl wird als eigener Prozess ausgeführt, also in einer Subshell. • Die Syntax für eine Pipeline sieht so aus: [ ! ] command [ [|⎪|&] command2 ... ] Also ein oder mehrere Befehle, getrennt durch | (genannt Pipe, umleiten der Ausgabe) oder |& (umleiten der Fehlerausgabe). Der Rückgabewert der Pipeline ist der Rückgabewert des letzten Befehls. Falls am Anfang der Pipeline ein Rufzeichen steht, wird der Rückgabewert logisch negiert. Pipelines - Beispiele • Alle installierten Benutzer-Befehle auflisten: $ man -k . | grep '(1)' | less Hier wird • • nach all Manpage-Einträgen gesucht, welche mindestens ein beliebiges Zeichen enthalten (man -k .); • danach werden mit grep '(1)' die Zeilen herausgefiltert, die die Zeichenkette ‚(1)‘ beinhalten (also jene Befehle, die in der Manpage-Gruppe 1 sind); • und zum Schluss wird das Ergebnis mit dem Pager less seitenweise dargestellt. Zählen der Dateien in einem Verzeichnis: $ ls -l /usr/include/ | wc -l 231 Listen • Eine Liste ist eine Folge einer oder mehrerer Pipelines, separiert durch einen der Operatoren ; & && || und optional terminiert durch ;, & oder einem Zeilenumbruch. Befehl1 [ [ ; ⎪ & ⎪ && ⎪ || ] Befehl2 ... ] [ ; | & ] Die Operatoren && und || haben gleichen Vorrang, gefolgt von ; und &, die auch gleichen Vorrang haben. • Operator ;: Die Befehle werden hintereinander ausgeführt. Der Rückgabewert ist der Rückgabewert des letzten Befehls. • Operator &: Der vorangegange Befehl wird im „Hintergrund“ ausgeführt, der Rückgabewert ist 0. Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 3 von 14 • Operator &&: Befehl2 wird nur dann ausgeführt, wenn Befehl1 den Rückgabewert 0 hat. Der Rückgabewert ist der Rückgabewert des letzten, ausgeführten Befehls. • Operator ||: Befehl2 wird nur dann ausgeführt, wenn Befehl1 einen Rückgabewert ungleich 0 hat. Der Rückgabewert ist der Rückgabewert des letzten, ausgeführten Befehls. Listen - Beispiele • Verzeichnis erstellen und sofort etwas hineinkopieren: $ mkdir foo && cp source foo/ • Unter Ubuntu die Paketlisten aktualisieren und alle neuen Pakete einspielen: $ apt-get update && apt-get upgrade • Eine Datei löschen und bei einem Fehler eine entsprechende Nachricht ausgeben: $ rm datei || echo Das Löschen ist fehlgeschlagen. • Kombination mehrerer Operatoren: $ echo sofort | cat; sleep 1 && echo zum schluss & echo in der mitte sofort [1] 15291 in der mitte $ zum schluss Verbundbefehle • (Liste): Die Liste wird in einem eigenen Shell-Prozess ausgeführt (d.h. unter anderem, dass gesetzte Variablen die aktuelle Shell nicht beeinflussen). Der Rückgabewert ist der Rückgabewert der Liste. • { Liste; }: Die Liste wird in der aktuellen Shell ausgeführt. Wichtig: Die Liste muss mit einem Semikolon oder einem Zeilumbruch terminiert werden und die geschwungenen Klammern müssen mit Leerzeichen von der Liste separiert sein! Der Rückgabewert ist der Rückgabewert der Liste. • ((Ausdruck)): Der Ausdruck stellt eine Rechnung dar und diese Rechnung wird von der Bash ausgeführt. Wenn das Ergebnis der Rechnung 0 ist, ist der Rückgabewert 1 und sonst 0. Mehr Informationen in der Manpage von bash unter „ARITHMETIC EVALUATION“. • [[ Ausdruck ]]: Der logische Ausdruck wird evaluiert und der Rückgabewert ist das Ergebnis der Evaluation. Mehr Informationen in der Manpage von bash unter „CONDITIONAL EXPRESSION“. Verbundbefehle - Beispiele • Liste in eigenem Shell-Prozess: $ X=5; (echo -n $X; X=7; echo -n $X); echo $X 575 • Liste im aktuellen Shell-Prozess: $ X=5; {echo -n $X; X=7; echo -n $X}; echo $X {echo: command not found Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 4 von 14 7}7 $ X=5; { echo -n $X; X=7; echo -n $X; }; echo $X 577 • Rückgabewert von Berechnungen verwenden: $ X=5 && (( X - 5 == 0 )) && echo yes || echo no yes $ X=6 && (( X - 5 == 0 )) && echo yes || echo no no • Rückgabewert von logischen Ausdrücken verwenden: $ X=hallo && [[ $X = hallo ]] && echo yes || echo no yes $ X=hallo && [[ $X = 'nicht hallo' ]] && echo yes || echo no no Expansion • Die bash unterstützt mehrere Arten von Expansionen, wir werden einen kurzen Blick auf die Klammernexpansion, Pfadexpansion, die Variablenexpansion und die Befehlssubstitution werfen. Abschließend werden wir auch noch die History-Expansion betrachten. • Diese Expansionen werden vor dem Ausführen der Befehle, aber nach der Unterteilung in einfache und komplexe Befehle, in einer vordefinierten Reihenfolge durchgeführt: • Klammernexpansion, • Variablenexpansion, • Befehlssubstitution und • Pfadexpansion Die Ergebnisse der Variablenexpansion und Befehlssubstitution werden nochmal in Wörter unterteilt, wobei als Worttrennzeichen der Inhalt der Variable $IFS benutzt wird. • Genaue Informationen zu diesem Thema findet man in der Manpage von bash unter EXPANSION. Klammernexpansion • Die Klammernexpansion (brace expansion) erlaubt das Generieren beliebiger Zeichenfolgen. Dabei werden keine speziellen Zeichen anderer Expansionen interpretiert, der Mechanismus basiert rein auf Textbasis. • Ein Muster für die Klammernexpansion besteht aus einem optionalen Präfix, einer Menge von entweder zwei oder mehr Zeichenfolgen, die mit Beistrichen getrennt in geschwungenen Klammern stehen, oder einer Sequenz, und einem Suffix. Muster können auch geschachtelt werden. Sequenzen haben die Form x..y[..Inkrement]. Also: Präfix{Zeichen1, Zeichen2, Zeichen3}Suffix • Beispiele: $ echo a{d,b,c}e ade abe ace $ echo a{00..10..2} Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 5 von 14 a00 a02 a04 a06 a08 a10 $ echo a{b,c{1..3},d}z abz ac1z ac2z ac3z adz Pfadexpansion • Bei der Pfadexpansion (pathname expansion) wird ein Muster mit passenden Dateinamen ersetzt. Das erlaubt die schnelle und einfache Behandlung von vielen Dateien auf einmal. • Ein Muster kann folgende, spezielle Zeichen beinhalten: • • *: Passt auf jeden Dateinamen. • ?: Passt auf genau ein Zeichen. • [...]: Passt auf genau die Zeichen in den Klammern. Mit einem Bindestrich kann man Bereiche von Zeichen angeben (z.B. a-z). Beispiele: $ echo folien_* folien_00.page folien_01.page folien_02.page folien_03.page folien_05.page $ echo *.template folien-print.template folien.template titelfolie.template $ echo folien_?[3-5]* folien_03.page folien_04.page folien_05.page folien_04.page Variablenexpansion • Bei der Variablenexpansion wird der Wert einer Variablen, eventuell verändert, zurückgegeben. • Die wichtigsten Varianten sind: • ${Variable}: Einfach den Wert zurückgeben. • ${Variable:Offset[:Länge]}: Alle (oder maximal ‚Länge‘ Zeichen) Zeichen ab Offset (0basierend) zurückgeben. • ${Variable#Präfix}: Das Präfix vom Wert löschen, falls der Wert mit dem Präfix beginnt. Das Präfix wird wie bei der Pfadexpansion behandelt. Mit zwei # wird das längste (sonst das kürzeste) Präfix gelöscht. • ${Variable%Suffix}: Das Suffix vom Wert löschen, falls der Wert mit dem Suffix endet. Das Suffix wird wie bei der Pfadexpansion behandelt. Mit zwei % wird das längste (sonst das kürzeste) Suffix gelöscht. • ${Variable/Muster/Zeichenfolge}: Im Wert wird der längster Treffer für das Muster (expandiert wie bei der Pfadexpansion) durch die Zeichenfolge ersetzt. Mit zwei / vor dem Muster werden alle Treffer ersetzt, sonst nur der erste. Variablenexpansion - Beispiele • Beispiele: VAR=TechnischePraxis Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 6 von 14 $ echo ${VAR} TechnischePraxis $ echo ${VAR:10} Praxis $ echo ${VAR:10:3} Pra $ echo ${VAR#*i} schePraxis $ echo ${VAR##*i} s $ echo ${VAR%i*} TechnischePrax $ echo ${VAR%%i*} Techn $ echo ${VAR/T*he/Andere} AnderePraxis Befehlssubstitution • Die Befehlssubstitution erlaubt das Ersetzen eines Befehls mit dessen Ausgabe. • Es gibt zwei Formen: `Befehl` oder $(Befehl). Bei komplizierteren Befehlen ist die zweite Form besser, da der Befehl so behandelt wird, als würde er alleine stehen. • Beispiele: $ VAR=$(echo a b); echo $VAR a b $ cat $(echo a b c) cat: a: No such file or directory cat: b: No such file or directory cat: c: No such file or directory $ cat "$(echo a b c)" cat: a b c: No such file or directory Bash-History-Expansion 1 • Mit Hilfe der Bash-History-Expansion kann man Teile vergangener Befehlszeilen in der aktuellen Befehlszeile nutzen. Die History-Expansion wird gleich nach der Eingabe durchgeführt, noch vor allen anderen Expansionen. • Ereignisbezeichner: • • !n → Befehlszeile n • !-n → Aktuelle Befehlszeile minus n • !! → Letzte Befehlszeile • ^alt^neu^ → In der letzten Befehlszeile die Zeichenfolge „alt“ durch „neu“ ersetzen Wortbezeichner (mit : von Ereignisbezeichner trennen, außer bei ^$*): • n → n-tes Wort • ^ → Erstes Wort • $ → Letztes Wort • x-y → Bereich von Worten; -y → 0-y; x- → x-$ Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 7 von 14 • * → Alle bis auf das nullte Wort (der Befehl) Bash-History-Expansion 2 • • Shell-Variablen: • HISTSIZE → Anzahl der Befehlszeilen, die im Speicher gehalten werden • HISTFILESIZE → Anzahl der Befehlszeilen, die maximal in die History-Datei geschrieben werden • HISTCONTROL → Mit Doppelpunkten getrennte Optionen: ignorespace → Befehlszeilen, die mit einem Leerzeichen beginnen, werden nicht gespeichert; ignoredups → Befehlszeilen, die ident zur vorangegangen Befehlszeile sind, werden ignoriert; ignoreboth → beide Optionen aktivieren Shell-Optionen: • histappend → Zeilen an die History-Datei anhängen (statt die History-Datei zu überschreiben) history - Bash-History anzeigen und manipulieren » Ohne Optionen wird die Bash-History angezeigt » Optionen: -c → History löschen, -d OFFSET → Zeile Offset löschen, -a → Aktuelle History-Zeilen an die History-Datei anhängen Bash-History-Expansion - Beispiele • Beispiele: $ echo hallo wie gehts? hallo wie gehts? $ !! echo hallo wie gehts? hallo wie gehts? $ echo !!* echo hallo wie gehts? hallo wie gehts? $ echo !$ echo gehts? gehts? $ history 3 38083 echo hallo wie gehts? 38084 echo gehts? 38085 history 3 Ein- und Ausgabeumleitung • Mit der Ein- und Ausgabeumleitung ist es möglich, als Eingabe für einen Befehl den Inhalt einer Datei zu verwenden oder die Ausgabe in eine Datei zu schreiben. • Die Umleitungsangaben können bei einem einfachen Befehl irgendwo stehen, bei einem komplexen Befehl nur danach. • <Datei: Die angegebene Datei wird als Standardeingabe (stdin) verwendet. • >Datei: Die angegebene Datei wird als Standardausgabe (stdout) verwendet. Falls die Datei noch nicht existiert, wird sie angelegt. Falls sie existiert, wird der Inhalt zuvor gelöscht. Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 8 von 14 • >>Datei: Die angegebene Datei wird als Standardausgabe verwendet, ohne den Inhalt der Datei zuvor zu löschen (d.h. die Ausgabe wird hinten angehängt). • Mit Hilfe von n<&Wort bzw. n>&Wort können Eingabe- bzw. Ausgabedatenströme dupliziert werden. Zum Beispiel bedeutet 2>&1, dass die Fehlerausgabe das selbe Ziel haben soll wie die Standardausgabe. Mehr Information in der Manpage von bash unter „REDIRECTION“ bzw. im Kapitel I/O Redirection des Advanced Bash-Scripting Guide. Ein- und Ausgabeumleitung - Beispiele • Dateien suchen und die gefundenen Dateien für die spätere Bearbeitung in eine Datei schreiben: $ find /usr/include -printf %P\\n > found_files $ find /usr/src/linux-headers-3.2.0-25/include/ -printf %P\\n >> found_files • Eine Pipeline mit Daten einer Datei füttern: $ ( grep /usb/ | sort | uniq | wc -l ) < found_files 48 • Die Ausgabe und/oder die Fehlerausgabe ignorieren: $ find /usr/include non_existing_directory 2>&1 >/dev/null find: `non_existing_directory': No such file or directory $ find /usr/include non_existing_directory >/dev/null 2>&1 $ find /usr/include non_existing_directory &>/dev/null • Zusatz: Die Standardeingabe in der aktuellen Shell schließen (äquivalent zum Befehl exit): $ exec 0<&- Named Pipes (FIFO) • Wir haben bei den Linux-Dateitypen unter anderem den speziellen Typ Named Pipe kennengelernt. Dateien dieses Typs funktionieren nach dem First in, first out-Prinzip (so wie die Pipelines), d.h. alles was „auf der einen Seite“ hineingeschrieben wird, kommt sofort ohne Zwischenspeicherung „auf der anderen Seite“ heraus. • Named Pipes werden oft benutzt, um Hintergrundprozessen, die schon beim Systemstart geladen worden sind, Daten zu schicken. • Solange nicht beide Seiten, also sowohl die Eingabeseite als auch die Ausgabeseite, einer Named Pipe benutzt werden, blockiert der Kernel den Datentransfer. Die Reihenfolge der Befehle spielt dabei keine Rolle. Named Pipes (FIFO) - Befehle (mkfifo) mkfifo - Erstellt eine Named Pipe » Parameter ist der Name der zu erstellenden Datei » $ mkfifo test; ls -l test prw-rw-r-- 1 thomas thomas 0 Oct 23 19:37 test $ echo hallo > test & [1] 21452 Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 9 von 14 $ cat <test hallo [1]+ Done echo hallo > test $ tail -f test | sed 's/NAME/Tux/g' & [1] 21582 $ echo Hallo, ich bin NAME. > test Hallo, ich bin Tux. $ echo NAME ist ein schöner Name, NAME, NAME, NAME, ... > test Tux ist ein schöner Name, Tux, Tux, Tux, ... Bearbeiten von Pfaden (basename, dirname) basename - Entfernt die führenden Verzeichnisse und optional ein Dateisuffix. » Parameter sind der Pfad und optional das Suffix. » $ basename /usr/include/ include $ basename /usr/include/fstab.h; basename /usr/include/fstab.h .h fstab.h fstab dirname - Entfernt die letzte Komponente vom Pfad. » Parameter ist der Pfad. » $ dirname /usr/include/ /usr $ dirname /usr/include/fstab.h /usr/include Einen Pfad in Verzeichnis, Dateiname und Dateierweiterung aufsplitten: $ FILE=/usr/include/fstab.h $ DIRNAME=$(dirname "$FILE"); BASENAME=$(basename "$FILE") $ FILENAME="${BASENAME%.*}"; EXTNAME="${BASENAME##*.}" $ echo "$FILE $DIRNAME $FILENAME $EXTNAME" /usr/include/fstab.h /usr/include fstab h Zeilen selektieren (head, tail) head - Gibt nur den Anfang einer oder mehrerer Dateien aus. » Optionen: -n [-]K → nur die ersten K Zeilen ausgeben, bzw. bei -K alle bis auf die letzten K Zeilen (default 10). » $ head -n 2 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh tail - Gibt nur das Ende einer oder mehrerer Dateien aus. » Optionen: -n [+]K → nur die letzten K Zeilen ausgeben, bzw. bei +K alle Zeilen ab der K-ten Zeile (default 10); -f → neue Zeilen ausgeben, sobald sie in der Datei erscheinen. » $ tail -n 2 /etc/passwd ntp:x:120:132::/home/ntp:/bin/false sshd:x:121:65534::/var/run/sshd:/usr/sbin/nologin Beide Befehle kombinieren um einen Bereich von Zeilen zu wählen: $ tail -n +5 /etc/passwd | head -n 2 # Zeilen 5 und 6 sync:x:4:65534:sync:/bin:/bin/sync Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 10 von 14 games:x:5:60:games:/usr/games:/bin/sh Zeilen sortieren (sort) sort - Sortiert die Zeilen einer oder mehrerer Dateien. » Standardmäßig wird alphabetisch sortiert, vom Zeilenanfang weg. » • -n → numerisch sortieren • -h → menschenlesbare Zahlen vergleichen (1G, 10K, …) • -r → Sortierrichtung umdrehen • -u → gleiche Zeilen nur einmal ausgeben • -t Zeichen → Feldtrennzeichen (default: Übergang von nicht-leer auf leer) • -k POS1[,POS2] → Felder POS1 bis POS2 (oder bis Zeilenende) verwenden » $ sort /etc/passwd | head -n 3 avahi-autoipd:x:105:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:106:113:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false backup:x:34:34:backup:/var/backups:/bin/sh $ sort -t : -k 3 /etc/passwd | head -n 3 root:x:0:0:root:/root:/bin/bash libuuid:x:100:101::/var/lib/libuuid:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh $ sort -n -t : -k 3 /etc/passwd | head -n 3 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh Teile einer Zeile auswählen (cut) cut - Gibt nur bestimmte Teile einer Zeile aus. » Nützliche Optionen: • -d Zeichen → Trennzeichen (default ist Tabulator) • -f Liste → nur die angegebenen Felder • --output-delimiter Zeichen → Trennzeichen für Ausgabe • -c Liste/-b Liste → nur die angegebenen Zeichen/Bytes Die Liste ist eine Folge von Bereichen, separiert mit Beistrichen: • N → N-tes Byte, Zeichen oder Feld, beginnend bei 1 • N- → ab N-tem Byte, Zeichen oder Feld • N-M → vom N-ten bis zum M-ten Byte, Zeichen oder Feld • -M → vom ersten bis zum M-ten Byte, Zeichen oder Feld » $ cut -d: -f 1-3,1 /etc/passwd | head -1 root:x:0 $ cut -d: -f 1-3,1 --output-delimiter=- /etc/passwd | head -1 root-x-0 $ cut -c 1-4,6 /etc/passwd | head -1 rootx Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 11 von 14 Zeilen von Dateien zusammenfügen (paste) paste - Fügt Zeilen von Dateien spaltenweise zusammen » Es ist das Gegenstück zu cut. » Optionen: -d Zeichen → die Zeichen als Separatoren verwenden anstatt des Tabulators » $ cut -d: -f1,2 /etc/passwd | head -n 5 > a $ cut -d: -f3- /etc/passwd | head -n 5 > b $ paste -d: a b root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync Sonstige Befehle für Textdateien (uniq) uniq - Zeigt wiederholte Zeilen an oder lässt sie weg. » Syntax: uniq [OPTION]... [Eingabe [Ausgabe]]. » Ohne Optionen werden wiederholte Zeilen nur einmal ausgeben. » Optionen: -u → nur einzigartige Zeilen ausgeben, -d → nur wiederholte Zeilen ausgeben, -f N → die ersten N Felder ignorieren (Felder werden von Leerzeichen/Tabulatoren getrennt) » $ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort -k 2 | uniq -f 1 -c 2 root /bin/bash 19 avahi-autoipd /bin/false 18 backup /bin/sh 1 sync /bin/sync 1 sshd /usr/sbin/nologin $ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort | uniq -u 1 sync /bin/sync 1 sshd /usr/sbin/nologin Sonstige Befehle für Textdateien (nl, wc) nl - Nummeriert Zeilen. » Es gibt viele Optionen, wie die Zeilen nummeriert werden sollen → Manpage! » $ nl /etc/passwd | tail -n +5 | head -n 2 5 sync:x:4:65534:sync:/bin:/bin/sync 6 games:x:5:60:games:/usr/games:/bin/sh wc - Zählt Zeilen, Wörter, Zeichen und Bytes einer oder mehrerer Dateien. » Standardmäßig wird die Anzahl der Zeilen, Wörter und Bytes Ausgabenreihenfolge ist immer: Zeilen, Wörter, Zeichen, Bytes. ausgegeben. Die » Optionen: -l → Anzahl der Zeilen ausgeben, -w → Anzahl der Wörter ausgeben, -c → Anzahl der Bytes ausgeben, -m → Anzahl der Zeichen ausgeben » $ wc notizen.org 22 111 755 notizen.org $ wc -c -m notizen.org 749 755 notizen.org Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 12 von 14 Sonstige Befehle für Textdateien (expand, unexpand) expand - Konvertiert Tabulator zu Leerzeichen » Optionen: -t x → Tabulator alle x Zeichen verwenden (Standard 8) » $ echo -e "hd\tt" | expand -t 4 hd t $ echo -e "hd\tt" | expand -t 8 hd t unexpand - Konvertiert Leerzeichen zu Tabulatoren » Optionen: -t x → Tabulator alle x Zeichen verwenden (Standard 8) » $ echo hd $ echo hd $ echo hd $ echo hd t -e "hd\tt" | t -e "hd\tt" | t -e "hd\tt" | t -e "hd\tt" | expand -t 8 | unexpand -t 8 expand -t 8 | unexpand -t 4 expand -t 4 | unexpand -t 4 expand -t 4 | unexpand -t 8 Sonstige Befehle (which, tee) which - Befehl suchen » Sucht nach dem als Argument übergebenen Befehl im aktuellen Pfad » Optionen: -a → Alle gefundenen Befehle anzeigen » $ which ruby /home/thomas/.rvm/rubies/ruby-2.0.0-p247/bin/ruby $ which -a ruby /home/thomas/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/thomas/.rvm/bin/ruby /usr/bin/ruby /home/thomas/.rvm/bin/ruby tee - Ausgabe auf das Terminal und in Dateien schreiben » Nützlich, wenn die Eingabe gleichzeitig verarbeitet und in Dateien geschrieben werden soll » Optionen: -a → Ausgabe an die Dateien anhängen » $ echo "Hinzugefügte Zeile" | sudo tee -a /etc/motd > /dev/null $ cat /etc/passwd | tee >(sha256sum) >(md5sum) >(sha1sum) > /dev/null a11724cdd8d53db9ef919d19fec2d41b97da6be6 b29c74c00f7941e99cc59e882b2d6589 48437f19c39134b2d878fe195d59ebbcc4fab13c81dd8afe28f2da4bb7bbd1b2 $ wget -O- http://mat.univie.ac.at/praxis/wisem13/uebung/find.tar.bz2 | tee f.tbz2 | tar xjv Bash-Optionen setzen (shopt) shopt - Shell-Optionen setzen » Zeigt Shell-Optionen an oder setzt sie. » Optionen: -p → alle Shell-Optionen und deren Werte anzeigen, -s → Option aktivieren, -u → Option deaktivieren » Einige nützliche Optionen: • autocd → Verzeichnis als Befehl verstehen und hineinwechseln • cdspell → Kleine Fehler in Verzeichnisnamen werden automatisch korrigiert Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Seite 13 von 14 • dotglob → Versteckte Pfade (i.e. solche, die mit einem Punkt beginnen) werden bei der Pfadexpansion berücksichtigt • failglob → Muster, auf die kein Pfad passt, verursachen einen Fehler • hostcomplete → Hostnamen vervollständigen • nullglob → Muster, auf die kein Pfad passt, werden zu einem Leerwort expandiert anstatt zu sich selbst Copyright und Lizenz • Copyright: Thomas Leitner [email protected] • Basiert teilweise auf den Folien von Harald Schilly [email protected] • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2013 | Version: 2013-12-07 10:26 Bedingungen 3.0 Seite 14 von 14