Umgang mit der Shell
Einfache Shellsonderzeichen
| ; | Trenne Kommandos |
| # | Kommentar |
| & | Programm im Hintergrund starten |
| | | STOUT von links wird zu STDIN von rechts |
| * | steht für beliebig viel Zeichen auch 0 |
| ? | steht für genau ein Zeichen |
| [abc] | steht für eins der Zeichen in [ ] hier a b oder c |
| ~ | das Homeverzeichnis |
| > und >> | leite in Datei um > überschreibe >> hänge an |
| < | lesen aus Datei |
| 2>&1 | leite STDERR auf STDOUT |
| << ende | Lesen aus Datei (Heredokument) |
| { , , , } | Zeichenketten zusammensetzen |
| "..." | Entwertung der Sonderzeichen ausser $ ' \ |
| '...' | Entwertung sämtlicher Sonderzeichen ausser ' selbst |
| \ | Entwertung des folgenden Sonderzeichens |
Eingabe/Ausgabe
Standardeingabe (0): Laufende Programme erwarten von hier ihre Eingaben (normalerweise handelt es sich um die Tastatur).
Standardausgabe (1): Programme schreiben auf diese ihre Ausgaben (Bildschirm).
Standardfehlerausgabe (2) : Fehlerausgaben landen hier (Bildschirm, aber nur die aktive Konsole).
Umleitungen
cat
Das Programm cat liest von STDIN und gibt es STDOUT wieder aus, solange bis das EOF Zeichen kommt.
root@zero:~# cat bla bla bla bla
Einlesen der Datei dat
root@zero:~# cat < dat wichtig
Schreiben in die Datei dat, dies überschreibt den bisherigen Inhalt der Datei
root@zero:~# cat > dat sogar noch wichtiger
Ausgeben der Datei text
root@zero:~# cat dat sogar noch wichtiger
Lesen aus der Datei dat und schreiben in die Datei neuedat
root@zero:~# cat < dat > neuedat root@zero:~# cat < neuedat sogar noch wichtiger
Anhängen der Ausgabe von date an die Datei neuedat
root@zero:~# date >> neuedat root@zero:~# cat neuedat sogar noch wichtiger Do 18. Jun 14:08:58 CEST 2009
Umleiten des Standardfehlerkanals nach error
root@zero:~# rm sux 2> error root@zero:~# more error rm: Entfernen von „sux“ nicht möglich: No such file or directory
Zusammenlegen von Standardausgabe und des Standardfehlerkanals
root@zero:~# touch tux root@zero:~# rm -v sux tux > aus-err 2>&1 root@zero:~# cat < aus-err rm: Entfernen von „sux“ nicht möglich: No such file or directory „tux“ entfernt
Nacheinander auszuführende Kommandos
root@zero:~# pwd; date /root Do 18. Jun 14:13:05 CEST 2009
Verknüpfung von cat und wc
root@zero:~# thomas@lydia:~$ cat < aus-err | wc -l 2
Übergeben der Ausgabe von tail als Eingabe von grep mit Hilfe der Pipe "|"
root@zero:~# tail /var/log/auth.log | grep xinux Jun 18 13:52:33 zero nss_wins[11433]: pam_unix(login:session): session closed for user xinux
Übergeben der letzten 100 Zeilen von syslog als Eingabe von grep
root@zero:~# tail /var/log/syslog -n 100 | grep error Jun 18 09:30:54 zero kernel: [154384.692135] end_request: I/O error, dev fd0, sector 0 Jun 18 09:30:54 zero kernel: [154384.712137] end_request: I/O error, dev fd0, sector 0
Jokerzeichen in der Shell
thomas@cardassia:~$ mkdir test thomas@cardassia:~$ cd test/ thomas@cardassia:~/test$ thomas@cardassia:~/test$ touch a ab abc abcd abcd b cd efg haij
Ein * steht für jedes Zeichen beliebig oft
thomas@cardassia:~/test$ ls * a ab abc abcd b cd efg haij thomas@cardassia:~/test$ ls ab* ab abc abcd
Ein ? steht für ein Zeichen
thomas@cardassia:~/test$ ls ? a b thomas@cardassia:~/test$ ls ?? ab cd thomas@cardassia:~/test$ ls ???* abc abcd efg haij
Eine [] steht genau für ein Zeichen das in der Klammer ist
thomas@cardassia:~/test$ ls [ab] a b thomas@cardassia:~/test$ ls [abc]? ab cd
Eine [!] steht genau für ein Zeichen das nicht in der Klammer ist
thomas@cardassia:~/test$ ls [!abc]* efg haij
Mit der {element1,element2} kann man Dateinamen generieren
thomas@cardassia:~/test$ mkdir -v dir{1,2,3,4,5,6}
mkdir: Verzeichnis „dir1“ angelegt
mkdir: Verzeichnis „dir2“ angelegt
mkdir: Verzeichnis „dir3“ angelegt
mkdir: Verzeichnis „dir4“ angelegt
mkdir: Verzeichnis „dir5“ angelegt
mkdir: Verzeichnis „dir6“ angelegt
Backup mit Dateinamengenerierung
*cp -v xx{,.save}
Wenn kein Treffer erfolgt wird das Sonderzeichen eingesetzt
thomas@cardassia:~/test$ rm -r * thomas@cardassia:~/test$ mkdir -v * mkdir: Verzeichnis „*“ angelegt thomas@cardassia:~/test$ cd * thomas@cardassia:~/test/*$
Entwerten kann man ein Sonderzeichen mit einem \
thomas@cardassia:~/test$ rm -rvi \* rm: Verzeichnis „*“ entfernen? n
Entwerten kann man mehrereSonderzeichen mit ""
thomas@cardassia:~/test$ rm -rvi "*" rm: Verzeichnis „*“ entfernen? n
Entwerten kann man mehrereSonderzeichen mit
thomas@cardassia:~/test$ rm -rvi '*' rm: Verzeichnis „*“ entfernen? n
wc
tr
expand(lpi)
Ersetzt Tabulatorzeichen durch Folgen von Leerzeichen und schreibt das Ergebnis auf die Standardausgabe
root@zero:~# expand /etc/samba/smb.conf ...
fmt(lpi)
- Setzt den Text der Dateien im Blocksatz der angegebenen Breite durch Auffüllen von Zeilen und Entfernen von Zeilenwechseln.
Standardgemäß werden Leerzeilen, die Position von Leerzeichen und der Einzug am Zeilenanfang erhalten. fmt versucht, Zeilenumbrüche an Satzenden durchzuführen sowie sie nach dem ersten oder vor dem letzten Wort eines Satzes zu vermeiden.
fmt [Optionen] [Dateien]
Optionen
- -p Präfix: Formatiert nur Zeilen, die mit Präfix anfangen
root@zero:/tmp# fmt -p '#' text #Setzt den Text der Dateien im Blocksatz der angegebenen Breite durch #Auffüllen von Zeilen und Entfernen von Zeilenwechseln. Standardgemäß #werden Leerzeilen, die Position von Leerzeichen und der Einzug am #Zeilenanfang erhalten. fmt versucht, Zeilenumbrüche an Satzenden durchzuführen sowie sie nach dem ersten oder vor dem letzten Wort eines Satzes zu vermeiden.
- -u : Erzwingt genau ein Leerzeichen zwischen Wörtern und zwei Leerzeichen zwischen Sätzen
- -w Breite: Setzt die Ausgabebreite auf Breite
root@zero:/tmp# fmt -w 30 text #Setzt den Text der Dateien im Blocksatz der angegebenen Breite durch Auffüllen von Zeilen und Entfernen von Zeilenwechseln. #Standardgemäß werden Leerzeilen, die Position von Leerzeichen und der Einzug am Zeilenanfang erhalten. fmt versucht, Zeilenumbrüche an Satzenden durchzuführen sowie sie nach dem ersten oder vor dem letzten Wort eines Satzes zu vermeiden.
join(lpi)
Führt die Zeilen zweier sortierter Dateien anhand von Übereinstimmungen in einem gemeinsamen Feld zusammen.
root@zero:~# more name 1. karl 2. heinz 3. hans 4. otto root@zero:~# more tel 1. 1234 2. 4321 3. 222 4. 121212 root@zero:~# join name tel > telefonbuch root@zero:~# more telefonbuch 1. karl 1234 2. heinz 4321 3. hans 222 4. otto 121212
root@zero:~# join -t : /etc/passwd /etc/shadow .... daemon:x:1:1:daemon:/usr/sbin:/bin/sh:*:14181:0:99999:7::: bin:x:2:2:bin:/bin:/bin/sh:*:14181:0:99999:7::: sys:x:3:3:sys:/dev:/bin/sh:*:14181:0:99999:7::: sync:x:4:65534:sync:/bin:/bin/sync:*:14181:0:99999:7::: ...
join in dat1 nach Feld 3 und in dat2 nach Feld 2
thomas@lydia:~$ cat dat1 hugo:ps:1111 erwin:zw:2222 karl:sb:3333 rudi:kl:4444 thomas@lydia:~$ cat dat2 blau:1111:svn grün:2222:fcs gelb:3333:fch rot:4444:fck thomas@lydia:~$ join -t : -1 3 -2 2 dat1 dat2 1111:hugo:ps:blau:svn 2222:erwin:zw:grün:fcs 3333:karl:sb:gelb:fch 4444:rudi:kl:rot:fck
nl(lpi)
Nummeriert die Zeilen in einer Datei.
root@zero:~# nl /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin:x:2:2:bin:/bin:/bin/sh
4 sys:x:3:3:sys:/dev:/bin/sh
5 sync:x:4:65534:sync:/bin:/bin/sync
...
Nummereriet mit führenden Nullen der Separatir ist ein :
root@zero:~# nl -s : -n rz dat1
od
Gibt Dateien im Oktal und anderen Formaten aus.
od [Optionen] Datei
- -j Bytes: Überspringt die Anzahl Bytes einer Datei
- -N Bytes: Gibt nur die Anzahl Bytes aus
- -c : Gebe ASCII Zeichen aus
- -f : Gebe Fließkommazahlen aus
- -i : Gebe Dezimal Integer aus
- -l : Gebe Dezimal Long aus
- -o : Gebe Oktal 2 Byte Einheiten aus
- -s : Gebe Dezimal 2 Byte Einheiten aus
- -x : Gebe Hexadezimale 2 Byte einheiten aus
Beispiele
Gebe Master Boot Record (die ersten 512 Byte der Festplatte /dev/sda) als Hexadezimal aus
root@zero:~# od -x -N 512 /dev/sda 0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e 0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006 0000040 be00 07be 0438 0b75 c683 8110 fefe 7507 0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203 0000100 00ff 2000 0001 0000 0200 90fa f690 80c2 ...
Schreibe "suxer" in die Datei test
root@zero:~# echo "suxer" > test
Ausgabe Hexadezimal
root@zero:~# od -x test 0000000 7573 6578 0a72 0000006
Ausgabe ASCII Zeichen
root@zero:~# od -c test 0000000 s u x e r \n 0000006
paste(lpi)
Fügt die Zeilen von zwei oder mehr Dateien horizontal zusammen
root@zero:~# paste name tel 1. karl 1. 1234 2. heinz 2. 4321 3. hans 3. 222 4. otto 4. 121212
pr(lpi)
Bereitet Textdateien zum Drucken vor.
root@zero:~# echo "Plan für heute" > dokument root@zero:~# more dokument Plan für heute root@zero:~# pr dokument 2009-06-19 12:44 dokument Seite 1
Plan für heute
Anmerkung Ausmaße der Bildschirmausgabe wie eine Druckseite.
sed
streaming editor. Mit sed ist es möglich, den Inhalt einer Datei automatisch (nicht interaktiv) zu bearbeiten. Wie unter Linux üblich, wird auch hier der Text nicht wirklich verändert sondern die Änderung erfolgt über die Standardausgabe, die wieder umgeleitet werden kann. Die Syntax ist ähnlich des ex modus von vi. Reguläre Ausdrücke können nach Belieben benutzt werden.
Optionen:
-e Zeichenkette wendet die Editorbefehle aus Zeichenkette auf den Text an. -n gibt nur die Zeilen aus, die explizit (durch "p" ausgedruckt werden sollen
Gibt die dritte Zeile der Datei text aus
root@zero:~# sed -n "3p" text 34
Gibt die erste bis dritte Zeile von text aus
root@zero:~# sed -n "1,3p" text sogar noch wichtiger 123 34
Löschen der Zeile mit "sogar"
root@zero:~# sed -e '/sogar/d' < text 123 34 4711 test
und schreiben in text2
root@zero:~# sed -e '/sogar/d' < text > text2 root@zero:~# more text2 123 34 4711 test
Alle 3en durch DREI ersetzen
root@zero:~# sed -e 's/3/DREI/g' < text sogar noch wichtiger 12DREI DREI4 4711 test
sort
Zum sortieren von Dateien nach Feldern benutzt man sort. sort liest von STDIN, man kann die Datei aber auch als Argument übergeben.
Sortiert nach dem ersten Feld
root@zero:~# sort /etc/passwd
Es wird geprüft ob die Datei schon sortiert ist
root@zero:~# sort -c /etc/passwd
Sortiert nach dem ersten Feld (Richtungsumkehr)
root@zero:~# sort -r /etc/passwd
Führende Leersortzeichen werden ignoriert
root@zero:~# sort -b /etc/passwd
Ausgabe in die Datei pass
root@zero:~# sort /etc/passwd -o pass
nimmt : als Trenner -Voreinstellung ist TAB
root@zero:~# sort -t : /etc/passwd
sortiert nach dem 3 Feld, der Trenner ist : und es wird nummerisch sortiert
root@zero:~# sort -t: -k 3 -n /etc/passwd
Sortiert nach dem 3 bis zum 5 Feld, der Trenner ist : und es wird nummerisch sortiert
root@zero:~# sort -t: -k 3,5 -n /etc/passwd
