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