Textverarbeitung in der Unix-Shell
Peter Keel,
Király András
Die Shell ermöglicht die Eingabe von Befehlen via Texteingabe
(Kommandozeile). Unter Unix existieren ganze Mengen dieser Shells,
je nach Unix wird die eine oder andere bevorzugt: csh, tcsh,
ksh, bash und zsh. Unter Linux normalerweise
bash, unter MacOS X die tcsh. Die Shells unter
Unix sind das Äquivalent zur command.com respektive cmd unter
Windows, jedoch ungleich mächtiger.
Das erste was man von der Shell sieht ist ein Fenster mit einem
Prompt, welches anzeigt dass man nun Befehle eingeben kann. Dieses
sieht vielleicht so aus:
bash$
Man kann es anpassen. Der Superuser (root) hat normalerweise ein
Octothorp (#) statt eines Dollarzeichens ($), und auch sonst kann
es beliebig anpassen, dazu später mehr.
Beispiele:
hostname:/verzeichnis$
Unter Unix sind Verzeichnisse (Directories, Folders) durch einen
Slash (/) getrennt. Die Schreibweise von Verzeichnissen in URLs
(https:////www/verzeichnis/) korrespondiert auch damit, weil das WWW
unter Unix erfunden wurde. Es gibt keine Laufwerksbuchstaben,
stattdessen werden alle Geräte und Disks irgendwo in den
Verzeichnisbaum eingehängt. Die Wurzel des Baums ist dabei das
root-Verzeichnis ''/''.
Jeder Benutzer besitzt ein Home-Verzeichnis, welches dasjenige
Verzeichnis ist, welches er nach dem einloggen oder dem Aufruf der
Shell zuerst zu sehen bekommt. Es ist auch das einzige Verzeichnis
in dem er Schreibrechte besitzt (von Ausnahmen wie /tmp abgesehen).
Es kann auch durch die Tilde () angezeigt
werden.
Dateien die mit einem Punkt (''.'') beginnen sind grundsätzlich
versteckte Dateien. Dies ist nicht vor allem aus Sicherheitsgründen
so, sondern der Übersichtlichkeit halber, da diese im Normalfall
uninteressant sind.
Unix-Befehle (Kommandos,Programme) kennen viele Parameter, mit
denen sich einstellen lässt wie ein Programm reagieren soll, oder
auf was es reagieren soll. Dabei gilt dass diese immer mit einem
Leerschlag (Space) vom Programmnamen getrennt sein müssen. Optionen
die das Programm selber kennt, werden mit dem Dash (''-'') oder dem
doppelten Dash (''-'') vom Kommando abgetrennt. Ein typischer
Parameter ist ''-h'' oder ''-help'' um Hilfe zum Kommando zu
bekommen.
Wildcards sind Zeichen, die für beliebige andere stehen können. Es
sind dies das Fragezeichen (''?'') welches für EIN beliebiges
anderes Zeichen steht, und der Stern (''*'') welcher für beliebig
viele andere Zeichen steht. Sie werden typischerweise verwendet um
einem Programm ganz viele Dateinamen als Parameter zu übergeben.
Diese ist unter Unix wichtig. Eine Datei namens "Dateiïst durchaus
nicht dieselbe wie die Datei namens ''datei'' oder die andere
namens ''DATEI'', oder "DaTeiöder ''DatEi'' usf..
Mit '''' lässt sich die Ausgabe eines Programms
in eine Datei umleiten, respektive mit '''' die
Eingabe. Die doppelte Umleitung '''' fügt die Ausgabe eines Programms an einer Datei an,
ohne diese zu überschreiben.
Die Pipe ('''') ermöglicht es die Ausgabe eines
Kommandos direkt einem anderen Kommando zu übergeben. Derselbe
Effekt kann durch die Umleitung in eine Datei und das Lesen aus
dieser erreicht werden, doch mit der Pipe geht das ohne Umweg.
Kommandos lassen sich mit Control-C abbrechen, und mit Control-Z
unterbrechen (und in den Hintergrund schieben).
Wenn man den Anfang eines Kommandos oder Dateinamens weis, kann man
durch Eingabe der ersten paar Buchstaben und die Tabulator-Taste
den Namen automatisch komplettieren lassen. Dies geht in den
meisten modernen shells. ''toutab'' wird also automatisch zu ''touch'' expandiert.
Print Working Directory
Dieses Kommando zeigt uns an wo im Verzeichnisbaum wir uns
befinden.
hostname:$ pwd
/home/user
Make Directory
Damit können wir ein Verzeichnis erstellen.
hostname:$ mkdir verzeichnis
Change Directory
Damit können wir nun das Verzeichnis wechseln. Der Punkt designiert
dabei das momentane Verzeichnis, der zweifache Punkt das
Vorangehende. cd ohne Parameter wechselt in das home-Verzeichnis
des Benutzers.
hostname:$ cd verzeichnis
hostname:/verzeichnis$
hostname:/verzeichnis$ cd ..
hostname:$
oder
hostname:/verzeichnis$ cd
hostname:$
List
Zeigt uns die Verzeichnisse und Dateien in einem Verzeichnis an.
Der wichtigste Parameter ist ''-l'', welcher ein langes Listing
anzeigt welches mehr informationen enthält. Ein weiterer wichtiger
Parameter ist ''-a'', damit werden auch die Versteckten Dateien
angezeigt. Man kann die Parameter auch zusammenfassen (''-al'').
hostname:$ ls
verzeichnis
hostname:$ ls -l
total 4
tdrwxr-xr-x 2 user user 4096 2003-01-10 13:31
verzeichnis
hostname:$ ls -a
. .. .alias .bash_logout .bash_profile .bashrc
verzeichnis
thostname:$ ls -al
ttotal 36
t drwxr-xr-x 3 user user 4096 2003-01-10 13:31 .
tdrwxr-xr-x 197 root root 12288 2003-01-10 13:29 ..
t-rw-r-r- 1 user user 266 1999-07-08 22:53 .alias
t-rw-r-r- 1 user user 175 2000-10-02 17:09
.bash_logout
t-rw-r-r- 1 user user 556 2002-09-12 00:51
.bash_profile
t-rw-r-r- 1 user user 1263 2002-11-04 10:02 .bashrc
tdrwxr-xr-x 2 user user 4096 2003-01-10 13:31
verzeichnis
In der langen Darstellung sehen wir auch diverse merkwürdige
Nummern und Namen. Der Reihe nach sind dies Filetyp und Permissions
(die Rechte) auf die Dateien, die Grösse in Blöcken, der Besitzer,
die Gruppe, die wirkliche Grösse in Bytes, das Datum der letzten
Modifikation und den Dateinamen. Am Beispiel:
hostname:$ ls -l
total 4
drwxr-xr-x 2 user user 4096 2003-01-10 13:31
verzeichnis
Der erste Teil ''drwxr-xr-x'' sagt uns zuerst einmal den
Dateityp (''d'') nämlich ein Verzeichnis. Dahinter folgen drei
3er-Blöckchen mit den Rechten. Zuerst kommen die Rechte des
Besitzers, dann der Gruppe, und dann des Rests der Welt. Jedes
Blöckchen gibt an ob er die Datei lesen (read ''r''), schreiben
(write, ''w'') oder ausführen (execute, ''x'') darf. Hier darf also
der Besitzer lesen, schreiben und ausführen, die Gruppe nur lesen
und ausführen, und der Rest der Welt ebenfalls nur lesen und
ausführen. Speziell hier ist noch, dass das ein Verzeichnis ist,
und hier gilt dass Äusführen das Recht ist ins Verzeichnis zu
wechseln.
Danach folgt die Grösse in Blöcken auf der Disk, hier also 2.
Die Blöcke sind meist 4KB gross. Das braucht uns aber jetzt nicht
zu interessieren.
Danach kommt der Besitzer (''user'') und die Gruppe (ebenfalls
''user'') dem die Datei gehört.
Nun kommt die Grösse der Datei (''4096'') in Bytes. In diesem
Fall ist das ein Verzeichnis, und als solches hat es unter Unix
tatsächlich eine Grösse, weil es Platz braucht die
Verzeichniseinträge zu verwalten.
Zum Schluss kommt noch das Datum der letzten Modifikation und
der Dateiname.
Remove Directory
Damit können wir Verzeichnisse löschen.
hostname:$ ls
verzeichnis
hostname:$ rmdir verzeichnis
hostname:$ ls
Unix hat keinen spezifischen Befehl zum anlegen von Dateien,
deshalb muss ein anderes Programm herhalten. touch setzt eigentlich
das Datum der letzten Modifikation einer Datei auf den momentanen
Zeitpunkt. Falls die Datei aber nicht existiert, wird sie neu
angelegt.
hostname:$ touch Datei
hostname:$ ls -l
-rw-rw-r- 1 user user 0 2003-01-10 13:55 Datei
Copy
Damit können wir Dateien kopieren.
hostname:$ ls
Datei
hostname:$ cp Datei Datei2
hostname:$ ls
Datei Datei2
Remove
Dieser Befehl löscht eine Datei. Wichtige Parameter sind ''-f'' was
''force'' bedeutet und ohne nachfragen löscht, und ''-r'' was
''rekursiv'' bedeutet und dazu benutzt werden kann ganze
Verzeichnisbäume zu löschen. Normalerweise ist es unmöglich eine
Datei danach wieder herzustellen, der Befehl ist also gefährlich
und ein ''rm -rf *'' könnte das ganze aktuelle Verzeichnis löschen.
hostname:$ ls
Datei Datei2
hostname:$ rm Datei2
hostname:$ ls
Datei
Move
Dieser Befehl dient zum verschieben oder umbenennen von Dateien.
hostname:$ ls
Datei Datei2 verzeichnis
hostname:$ mv Datei verzeichnis
hostname:$ mv Datei2 Datei3
hostname:$ ls
Datei3 verzeichnis
hostname:$ ls verzeichnis
Datei
Manual
Unter Unix besitzt jedes Kommando ein zugehöriges Manual. Dieses
kann man mit ''man kommando'' abrufen. Vorausgesetzt man weis zu welchem Kommando
man das Manual möchte...
Concatenate
Mit cat kann man den Inhalt einer Datei anzeigen, oder mehrere
Dateien aneinander Anfügen.
hostname:$ cat > Test
1 a AA
2 b BB
1 a AA
3 c CC
CTRL-C
hostname:$ cat Test
1 a AA
2 b BB
1 a AA
3 c CC
Word Count
wc zählt ganz einfach wieviele Zeilen, Wörter und Zeichen
ein Text enthält.
hostname:$ wc Test
4 12 28 Test
Manchmal möchte man Dateien Seitenweise angezeigt haben (um dann
jedesmal ''more'' bestätigen können wenn man die nächste Seite
sehen möchte).
Eine bessere Version von ''more'', mit der man auch nach oben
scrollen kann.
Head zeigt nochmals die Datei an, diesmal nur den Kopf. Ein
Parameter ''-<nummer>'' kann angeben werden um entsprechend
viele Zeilen auszugeben; per default sind es 10.
hostname:$ head -1 Test
1 a AA
Tail ist das Gegenteil von ''head'' und zeigt demgemäss das Ende
der Datei an, auch hier kann man mit ''-<nummer>'' angeben
wieviele Zeilen man möchte.
hostname:$ tail -1 Test
3 c CC
Mit sort können wir Dateien sortieren. Der Parameter
rßortiert in umgekehrter Reihenfolge. Um das gewünschte Resultat zu
erhalten bedarf es oft diverser weiterer Parameter.
hostname:$ sort Test
1 a AA
1 a AA
2 b BB
3 c CC
Dieser Befehl stellt sicher, dass eine Zeile nur einmal vorkommt.
Er funktioniert jedoch nur, wenn die doppelten Zeilen
aufeinanderfolgend sind.
hostname:$ uniq Test
1 a AA
2 b BB
1 a AA
3 c CC
hostname:$ sort Test > Test2
hostname:$ uniq Test2
1 a AA
2 b BB
3 c CC
Mit grep lässt sich nach Dateinhalten suchen. Wichtige
Parameter sind ''-v'' der nach Zeilen sucht in denen das gesuchte
NICHT vorkommt, und ''-r'' welches rekursiv durch den ganzen
Verzeichnisbaum sucht (''-r'' wird aber nicht von allen
Unix-Versionen unterstützt).
hostname:$ grep BB Test2
2 b BB
hostname:$ grep -v BB Test2
1 a AA
3 c CC
cut schneidet Spalten aus. Das Spaltentrennzeichen muss
dabei mit dem Parameter ''-d'' (Delimiter) angegeben werden
(ansonsten wird Tabulator angenommen) und die Felder mit ''-f
von-bis''. alternativ können auch mit ''-b
von-bis'' absolute Positionen in Zeichen
angebenen werden.
hostname:$ cut -d '' '' -f 2-3 Test2
a AA
b BB
c CC
hostname:$ cut -b 3-5 Test2
a A
b B
c C
Das Gegenteil zu cut. Fügt Dateien Spaltenweise zusammen:
hostname:$ paste Test Test2
1 a AA 1 a AA
2 b BB 2 b BB
1 a AA 3 c CC
3 c CC
Translate
Mit tr kann man in Textfiles Wörter oder Zeichenfolgen
durch andere ersetzen. tr ist etwas tricky zu handhaben
falls man ganze Wortketten durch andere ersetzen möchte, kann weder
zeichen durch mehrere Zeichen ersetzen noch die Reihenfolge der
Buchstaben verändern. tr liest von der Standardeingabe,
d.h. man muss ihm die Daten per Umleitung oder Pipe übergeben.
hostname:$ tr a b < Test2
1 b AA
2 b BB
3 c CC
hostname:$ cat Test2 tr
[:alnum:] b
b b bb
b b bb
b b bb
Compare
Vergleicht zwei Textfiles, Zeile für Zeile. Die Parameter ''-1'',
''-2'', und ''-3'' unterdrücken dabei jeweils die Ausgabe der
Zeilen die nur im ersten File, nur im zweiten File oder nur in
Beiden vorkommen.
hostname:$ comm Test Test2
1 a AA
2 b BB
1 a AA
3 c CC
hostname:$ comm -3 Test Test2
1 a AA
Join ermöglicht das Zusammenfügen von Dateien, wobei defaultmässig
der kleinste gemeinsame Nenner gilt.
hostname:$ join Test Test2
1 a AA a AA
2 b BB b BB
3 c CC c CC
Differences
Dies ist der grosse Bruder von comm. Diff kann wesentlich mehr, ist
aber auch viel komplizierter zu handhaben.
Mit split kann man Dateien in Teile zerlegen. Mit dem Parameter
''-l'' kann man angeben wieviele Zeilen es pro Teil sein sollen,
mit dem Parameter ''-b'' wieviele Zeichen. Default ist 1000 Zeilen.
Expandiert Tabulatoren (8 Zeichen breit) in 8 Leerzeichen und
umgekehrt. unexpand funktioniert nur pro 8 Leerzeichen.
Dieses Programm bricht Zeilen um. Damit lassen sich überlange
Zeilen auf eine auf Konsole oder Printer darstellbare Grösse
bringen.
Prepariert eine Datei zu Ausgabe auf ASCII-Printern. Erstellt
Seitennumerierung etc.
Formatiert Texte neu, damit sie einfacher gelesen werden können.
Gibt das aktuelle Datum und Zeit aus.
Disk Free
Zeigt den freien Speicherplatz auf den Disks an.
Oftmals werden verschiedene deutsche und englische Begriffe
gleichwertig verwendet. Es sind dies:
- Directory Verzeichnis, Folder, Ordner
- File, Datei
- Permissions, Rechte
- Space, Leerschlag
- Programm, Kommando, Befehl, Executable
- Terminal,Konsole
Die Namen von Zeichen und Tasten variieren im Sprachgebrauch auch
sehr, deshalb hier diejenigen die hier verwendet werden:
|
Tilde |
/ |
Slash |
|
Backslash |
- |
Dash oder Strich |
$ |
Dollar |
# |
Octothorp oder Hash |
? |
Fragezeichen |
|
Stern |
|
Pipe |
|
Umleitung Nach oder Grösser |
|
Umleitung Von oder Kleiner |
@ |
At |
& |
Ampersand |
' |
Tick |
` |
Backtick |
'' |
Anführungszeichen |
() |
Klammern |
|
Eckige Klammern |
{} |
Geschweifte Klammern |
Eine Kurze Kommandoübersicht:
pwd (print working directory) |
Aktuelles Verzeichnis anzeigen |
mkdir (make directory) |
Verzeichnis erstellen |
cd (change directory) |
Verzeichnis wechseln |
ls (list) |
Dateien auflisten |
rmdir (remove directory) |
Verzeichnis löschen |
touch |
Datei anlegen |
cp (copy) |
Datei kopieren |
rm (remove) |
Datei löschen |
mv (move) |
Datei verschieben |
man (manual) |
Manual ansehen |
cat (concatenate) |
Datei anzeigen oder zusammenfügen |
wc (word count) |
Wörter zählen |
more |
Datei seitenweise anzeigen |
less |
Datei seitenweise anzeigen |
head |
Kopf der Datei Anzeigen |
tail |
Fuss der Datei Anzeigen |
sort |
Sortieren |
uniq |
Duplikate aussortieren |
grep |
Finden |
cut |
Spalten ausschneiden |
paste |
Spalten einfügen |
tr (translate) |
Einzelne Zeichen ersetzen |
comm (compare) |
Dateien vergleichen |
join |
Dateien zusammenfügen |
split |
Dateien zerstückeln |
diff |
Dateien vergleichen |
expand |
Tabulatoren in Spaces umwandeln |
unexpand |
Spaces in Tabulatoren umwandeln |
fold |
Zeilen umbrechen |
pr |
Seitenlayout umwandeln |
fmt |
Seitenlayout umwandeln |
date |
Datum und Zeit anzeigen |
df |
Freien Diskplatz anzeigen |
Seegras 2003-01-11