Nützliche Unix-Befehle (auch für Mac OS X)

Kleine Unix-Programme erleichtern die Arbeit mit Dateien. Da Mac OS X ebenfalls auf Unix basiert, kann man diese Programme auch dort verwenden. Es ist ihnen aber gemeinsam, dass sie allesamt über die "Shell", also ziemlich spartanisch über Tastaturbefehle gesteuert werden.

Unter Mac OS X öffnet man dazu das Programm "Terminal", das sich unter "Programme -> Dienstprogramme" befindet. Dessen Icon sieht so aus:



Es öffnet sich die Shell, ein Fenster, das ungefähr so aussieht (standardmässig auch mit weissem Hintergrund):



Shells sehen alle etwa so aus. Gemeinsam ist ihnen, dass sie auf eine Eingabe warten, die (fast) nur mit der Tastatur erfolgen kann. Das "nb" vor dem Prozentzeichen steht für den Benutzernamen, mit dem man am Computer angemeldet ist, im abgebildeten Fall "Noah Bubenhofer"; entsprechend dem angemeldeten Benutzer/der Benutzerin steht hier ein anderer Name. Vor dem Benutzernamen steht das aktuelle Verzeichnis, in dem man sich befindet. Dabei steht die Tilde (~) für das Heimverzeichnis des angemeldeten Benutzers, was die unterste Ebene des Benutzerverzeichnisses ist.

Das Terminal/die Shell ist ein vollständiger Finder-Ersatz. Man kann sich damit durch die Verzeichnisse bewegen, die man auf dem Computer angelegt hat, Dateien ansehen, kopieren, verändern, Programme starten etc. Dabei wird zuerst immer ein Befehl eingetippt, dann auf die Zeilenschaltung gedrückt; dann wird der Befehl ausgeführt. Teilweise kann man durch Leerzeichen getrennt hinter den Befehl noch Argumente (Optionen zum Befehl) angeben.

Grundlegende Befehle

Um sich durch die Verzeichnisse zu bewegen, helfen folgende Befehle:

ls
Wenn man "ls" eintippt (und Zeilenschaltung) wird eine Liste der Dateien im Verzeichnis, in dem man sich gerade befindet, erzeugt.

Es gibt eine Vielzahl von Optionen, die man als Argumente mitgeben kann. Wenn man z.B. "ls -l" tippt, also die Option "-l" angibt, erhält man eine vollständigere Liste der Dateien mit Angaben zum letzten Änderungsdatum, der Dateigrösse etc.
cd
"change directory", Befehl um das Verzeichnis zu wechseln. Wenn man vorher mit "ls" gesehen hat, dass es im aktuellen Verzeichnis einen Ordner namens "daten" gibt, gibt man einfach "cd daten" ein. Sofort ist das Terminal wieder bereit und zeigt den aktuellen Ort, den sog. aktuellen Pfad (path), an, also "~/daten". Das bedeutet: Man befindet sich im Home-Verzeichnis und dort im Verzeichnis "daten".

Um eine Ebene zurück zu kommen, also von "daten" wieder ins Home-Verzeichnis, gibt man "cd .." ein. Die beiden Punkte bedeuten: eine Hierarchiestufe zurück.
pwd
Zeigt das aktuelle Verzeichnis an.
mkdir
"make directory": Erstellt ein neues Verzeichnis im aktuellen Verzeichnis. Natürlich muss zusätzlich noch ein Name angegeben werden. Also z.B. "mkdir meinedaten".
rmdir
"remove directory": Löscht ein (leeres) Verzeichnis wieder. Also z.B. "rmdir meinedaten".
man
"manual": Die Hilfe! Sie hilft immer weiter. Tippt man "man" und anschliessend einen Befehl, wird die Hilfe dazu angezeigt. Also z.B. "man ls" zeigt alle möglichen Optionen, mit man mit "ls" verwenden kann. In der Hilfe blättert man mit der Leerzeichentaste oder den Pfeilen. Man beendet sie, indem man "q" drückt.

Besonderheiten in Mac OS X

Drag-and-drop

Eine angenehme Hilfe, um mit Verzeichnissen im Terminal zu arbeiten, ist eine kleine Funktion in Mac OS X: Man kann eine Datei oder einen Ordner auch einfach vom Finder in das Terminal-Fenster ziehen und der gültige Pfad dahin wird dann im Terminal angezeigt.

Möchte man sich also z.B. rasch in ein Verzeichnis bewegen und nicht mit "cd"-Befehlen im Terminal dorthin gelangen, tippt man im Terminal einfach "cd", gefolgt von einem Leerzeichen, ein, und zieht dann das gewünschte Verzeichnis ins Terminalfenster. Der korrekte Pfad wird dann dort eingefügt. Anschliessend klickt man auf die Zeilenschaltung, und hopps, ist man bereits dort.

Das funktioniert natürlich auch mit Dateien: Möchte man z.B. einen Befehl auf eine Datei anwenden, tippt man ebenfalls diesen Befehl und zieht anschliessend die Datei auf das Terminal-Fenster.

Für Leute, die nicht gerade absolute Unix-Maniacs sind und normalerweise eher die Segnungen von grafischen User-Interaces nutzen, ist ein kombiniertes Arbeiten zwischen Befehlszeilen im Terminal und dem normalen Finder sinnvoll und auch völlig möglich und in Ordnung. Niemand hindert einen daran, eine Datei, einen Ordner ganz konventionell über den Finder anzulegen, später aber einen speziellen Unixbefehl über das Terminal anzuwenden!

Sonderzeichen in Dateinamen

Kleine Falle: In der Shell gibt es Probleme mit gewissen Sonderzeichen, vor allem mit Leerzeichen. Wenn ein Dateiname oder ein Verzeichnisname ein Leerzeichen enthält, kann man im Terminal den Namen nicht einfach so verwenden. Wenn es also z.B. ein Verzeichnis gibt, das "meine Daten" heisst, dann gibt ein Befehl wie "cd meine Daten" ein Problem. Und zwar, weil das Terminal meint, es handle sich bei "meine" und "Daten" um zwei Argumente.

Die Lösung dazu: Man "maskiert" das Leerzeichen mit einem umgekehrten Schrägstrich "\". Die Eingabe lautet dann "cd meine\ Daten". Dann funktioniert alles tiptop.

Dateimanipulation

Richtig interessant wird es erst mit ein paar einfachen, aber machtvollen Unix-Befehlen zur Dateimanipulation.

sort
Sortiert die Zeilen einer Textdatei ruckzuck alphabetisch oder auch anders. Grundlegende Anwendung: "sort dateiname". Die Datei wird dann sortiert direkt am Bildschirm ausgegeben. Möchte man stattdessen eine neue Datei erzeugen, die den sortierten Inhalt enthält, gibt man ein: "sort dateiname > neuerdateiname". Die vielfältigen Optionen sind über "man" ersichtlich.
cat
Fügt mehrere Dateien zusammen. "cat datei1 datei2 datei3" gibt auf dem Bildschirm alle drei Dateien aus. Möchte man wieder eine neue Datei erstellen, in der alle drei zusammengefügt sind, tippt man wieder "cat datei1 datei2 datei3 > neuedatei".
grep
Findet sog. Reguläre Ausdrücke, also Suchmuster, in einer Datei. Reguläre Ausdrücke bilden eine mächtige Suchsprache, um bestimmte Suchmuster zu finden.

"grep '.*terror.*' textdatei" findet in der Datei "textdatei" alle Vorkommen von "Terror", auch wenn vorher oder nachher noch Zeichen stehen. Weitere Informationen zu den regulären Ausdrücken sind hier verfügbar.
uniq
Zeigt alle Zeilen an, die mehr als einmal genau gleich vorkommen. Die Zeilen müssen aber vorher sortiert sein; man sollte die Datei also voher mit "sort" sortieren.

"uniq -d testdatei" gibt eine Liste aus von Zeilen, die in Testdatei mehr als einmal vorkommen. Das Argument "-d" bedeutet, dass wirklich nur mehrfach vorkommende Zeilen angezeigt werden.

"uniq -c testdatei" zählt wiederum mehrfach vorkommende Zeilen und schreibt vor die Zeilen aber gerade noch hin, wie oft die Zeilen vorkommen.

Wieder kann hier mit ">" angegeben werden, dass man das Resultat nicht als Liste im Terminal, sondern als Datei ausgegeben haben möchte.
wc
"word count": Zählt Zeilen, Wörter und Buchstaben in einer Datei.

"wc testdatei": Erstellt eine Liste mit den Anzahl Zeilen, Wörtern und Buchstaben in "testdatei".
>
Wir haben es oben bereits kennengelernt: Das Zeichen bedeutet, dass die Ausgabe in eine Datei geschrieben werden soll. Man kann also bei jedem Befehl zusätzlich dieses Zeichen und ein Dateinamen anhängen, worauf die Ausgabe, die ansonsten im Terminal landen würde, in die angegebene Datei geschrieben wird.

Übrigens: Diese Datei muss natürlich nicht zuerst erzeugt werden; wenn sie noch nicht existiert, wird sie einfach automatisch erzeugt. Aber achtung: Wenn bereits eine Datei dieses Namens besteht, wird sie einfach überschrieben!
|
"pipe": Mit der Pipe, der Röhre, können mehrere Befehle miteinander verhängt werden. Ein Beispiel:

"sort -d meinedatei | uniq -c > datei2": Hier wird zunächst der Befehl "sort" mit dem Argument "-d" auf die Datei "meinedatei" angewandt. Statt das Ergebnis aber einfach auszugeben, wird es gleich an den Befehl "uniq" weitergeleitet. Und der manipuliert dann mit dem Argument "-c" die Ausgabe von "sort", zählt also das mehrfache Vorkommen der Zeilen, und schreibt das Ergebnis in eine Datei "datei2".

Natürlich kann man das obige Beispiel auch in zwei Schritten machen, aber es kann natürlich ganz elegant sein, das so zu verknüpfen.

Interessante Befehle für die Korpuslinguistik

Man kann es an den bereits vorgestellten Befehlen bereits erahnen, dass es da interessante Befehle für die Korpuslinguistik geben könnte. Hier werden Kombinationen dieser Befehle vorgestellt.

Viele Befehle gehen von Textdateien aus, in denen einzelne Zeilen manipuliert werden (z.B. sort, uniq). Es ist deshalb sinnvoll, Textdateien so umzuformatieren, dass pro Zeile nur ein Wort steht. Dann machen Befehle wie "sort" oder "uniq" bei Textdateien korpuslinguistisch Sinn. Dieses Umformatieren besorgen wir natürlich auch mit einem einfachen Unix-Befehl...

Aus einer Textdatei Wortlisten erstellen:
tr ' ' '\012' < infile > outfile

tr -s '[[:punct:][:space:]]'
'\012' < outfile > wl
"tr" ersetzt Zeichen. Hier werden in einem ersten Schritt alle Leerzeichen durch Zeilenschaltungen (umschrieben mit \012) ersetzt. Dann wird die Interpunktion ebenfalls durch Zeilenschaltungen ersetzt und mehrere Leerzeichen gelöscht. Am Schluss haben wir eine Wortliste "wl".

Es gibt hier teilweise Schwierigkeiten mit Umlauten oder mit dem Wunsch, Zeichen nicht einfach nur zu ersetzen, sondern zu ergänzen (z.B. die Interpunktion von den Wörtern zu trennen). Unter Mac OS X ist es deshalb oft einfacher, mit einem Texteditor wie BBEdit zu arbeiten und dort eine Wortliste mit Hilfe der Grep-Suche mit Regular Expressions zu machen.
Sortieren und zählen:
sort -d wl | uniq -c > outfile
Die Kombination von sort und uniq ermöglicht das Zählen von Wörtervorkommen, wenn pro Zeile ein Wort steht (wie das mit dem oben vorgestellten Befehlskonstrukt machbar ist). Hier wird also zuerst eine Datei alphabetisch sortiert. Dann mit "uniq" werden die gleichen Zeilen gezählt.

Anschliessend kann man natürlich mit "sort -dr infile > outfile" die Datei nach Wortfrequenzen (absteigend) sortieren.
N-Gramme erstellen:
tail +2 wl > nextwords
paste wl nextwords > bigrams

tail +3 wl > nextnextwords

paste wl nextwords nextnextwords
> trigrams
...etc.

Hier eine elegante Methode, um N-Gramme, also Wortgruppen, aus 2 oder mehr Wörtern bestehend, zu berechnen. Mit "tail" werden neue Dateien erstellt, denen die erste, bzw. die ersten zwei Zeilen fehlen.

Mit "paste" werden jeweils die Originaldatei mit den anderen Dateien zusammengefügt, so dass man auf jeder Zeile jeweils die zwei oder drei aufeinanderfolgenden Wörter hat.

Jetzt haben wir Dateien "bigrams" und "trigrams", die alle möglichen Kombinationen von Wörtern enthalten. Jetzt kann man mit "sort" und "uniq", wie oben beschrieben, sortieren und Frequenzen der Wortgruppen zählen.
Dateien je nach Inhalt in ein anderes Verzeichnis legen:

Mit "grep" ist es ja möglich, die Inhalte von Dateien zu durchsuchen (siehe weiter oben). Dieser Befehl kann nun mit anderen Befehlen zur Manipulation von Dateien kombiniert werden. Das ist z.B. nützlich, wenn man ein Verzeichnis mit vielen Dateien hat, wobei man einen Teil der Dateien, in deren Inhalt ein bestimmtes Suchmuster vorkommt, in ein anderes Verzeichnis verschieben möchte. Das ist sinnvoll, wenn man beispielsweise aus einem Korpus ein Teilkorpus bilden möchte, das Dateien mit einem bestimmten Inhalt umfassen soll.

Nehmen wir an, wir haben ein Verzeichnis mit Dateien, z.B. Zeitungsartikel, die auf .xml enden. Darin gibt es einen Tag, in dem der Rubrikenname erscheint. Wir wollen nun aus unserem Korpus alle Artikel zusammenfassen, die in der Rubrik "Sport" erschienen sind. So geht das:
grep -l "<section>Sport</section>" Quellverzeichnis/*.xml | 
xargs -J % mv % Zielverzeichnis/
Mit "grep" wird die Suche ausgeführt (das Argument "-l" bewirkt, dass nur die Dateienamen ausgegeben werden, in denen es einen Treffer gab) und mit der Pipe (|) an den Move-Befehl ("mv") weitergereicht. Weil es sich um sehr viele Dateien handeln kann, was zu einer zu langen Argumente-Kette für "mv" führen kann, wird aber vorher "xargs" vorgeschaltet, das lange Argumente-Ketten in kleinere Portionen aufteilt.
Texte konvertieren und zusammenfügen mit textutil (mit Mac OS X):

Seit der Version 10.4 von Mac OS X gibt es ein tolles Programm "textutil", mit dem man einfach Texte konvertieren und zusammenfügen kann.

Man kann damit folgende Textformate je ineinander konvertieren: txt, html, rtf, rtfd, doc, wordml, webarchive

Am einfachsten lässt sich eine Datei so in ein anderes Format konvertieren:

textutil -convert doc inputdatei outputdatei

Damit wird die Inputdatei in das doc-Format konvertiert. Statt "doc" kann an der entsprechenden Stelle auch eines der oben erwähnten Formate genannt werden.

Man kann aber mit dem Argument -cat mehrere Dateien gleichzeitig konvertieren und in eine einzige Datei zusammenfügen. Das funktioniert z.B. so:

textutil -cat txt -output outputdatei.txt daten/*.html

Damit werden alle Dateien, die sich im Verzeichnis "daten" befinden und die Endung ".html" haben, ins Format txt konvertiert und in eine Datei namens "outputdatei.txt" zusammengefügt.

Weitere Hilfe kann mit "man textutil" aufgerufen werden.