Wir richten uns ein

E-Books


MS-DOS Kurs


11. Filter

Über die Umleitung von Ein- und Ausgabe hinaus kann der Datenstrom auch durch ein anderes Programm hindurchgeleitet werden. Dazu werden die Ausgaben des einen Programms einfach als Eingaben des anderen betrachtet. Diese Programme heißen Filter (englisch Pipes) und werden mit dem Ziel benutzt, die Ausgabe in irgendeiner Weise zu verändern, eben zu filtern. Zum Lieferumfang von DOS gehören drei Filter: SORT, FIND und MORE. Darüber hinaus kann man sich aber auch selbst Filterprogramme schreiben. Am einfachsten zu gebrauchen ist MORE. Es gibt stets nur 23 Zeilen auf dem Bildschirm aus und wartet dann auf einen Tastendruck.
Zum Anzeigen eines langen Dirctories verwendet man
dir | more
Wie zu sehen ist, dient zur Filterung eines Datenstromes der senkrechte Strich (|). Wenn Sie damit Probleme auf der Tastatur haben, so erinnern Sie sich bitte der Nutzung des ASCII-Codes. Mit diesem Wissen, daß der Code für den Strich 124(dezimal) ist, können Sie ihn erzeugen, indem die ALT-Taste gedrückt, rechts 124 getippt und die ALT-Taste wieder losgelassen wird. Mit dem Filterzeichen werden die Ausgaben des DIR-Befehls als Eingaben von MORE weitergeleitet. Das MORE-Filter erlaubt so eine seitenweise Ausgabe. Noch wichtiger als für den DIR-Befehl (wo man ja den /p-Schalter hat) ist MORE für TYPE:
type datei | more
Das SORT-Filter sortiert den Datenstrom. Zur alphabetisch sortierten Ausgabe des Verzeichnisses schreiben Sie
dir | sort
Es geht auch absteigend mit
dir | sort/r
Es muß nicht unbedingt nach dem Anfangsbuchstaben sortiert werden; die Anweisung
dir | sort/+9
sortiert die Dateien nach dem Typ, der gerade in der 9. Spalte einer jeden Zeile steht. Beachten Sie bitte, daß damit nur die Anzeige auf dem Bildschirm geändert wird, nicht etwa die Reihenfolge der Einträge in das Inhaltsverzeichnis. Durch das SORT-Filter können auch Dateien geschickt werden. Mit
sort < datei
erfolgt eine sortierte Ausgabe auf den Bildschirm, und mit
sort < altdatei > neudatei
wird das Ergebnis wiederum in eine Datei geschrieben. Probieren Sie es mal mit einer beliebigen Textdatei.
Das Sortieren der oben angelegten Datei INHALT mit den Verzeichnissen der Laufwerke A:, B: und C: würde diese Verzeichnisse übrigens bunt durcheinandermischen. Zum Schluß überlegen Sie bitte einmal, warum bei den letzten Befehlen das Filter am Anfang der Kommandozeile stand und nicht einfach dir > sort geschrieben werden kann. Sie können es gefahrlos ausprobieren: Es wird eine Datei mit den Namen SORT angelegt, und das war wohl nicht Sinn der Sache.
Noch vielfältiger kann das FIND-Filter eingesetzt werden, das ungefähr das macht, was man von einem Filter erwartet: Es filtert bestimmte Teile heraus. Gearbeitet wird zeilenweise, das heißt, es wird die gesamte Zeile ausgegeben, die die Suchbedingung erfüllt. So werden mit
dir | find "BAT"
nur die Dateien angezeigt, die die Zeichenkette "BAT" enthalten. Nicht eben genial, das hätte man auch mit Jokern erreicht. Aber können Sie auch alle Dateien außer den BAT-Dateien anzeigen ?
Kein Problem:
dir | find/v "BAT"
Achten Sie bitte darauf, daß an dieser Stelle Großbuchstaben für die Zeichenkette zu verwenden sind, da die Eintragungen im Directory sämtlich in Großbuchstaben umgewandelt werden. Ähnlich müssen Sie verfahren, wenn Sie nur die Unterverzeichnisse anzeigen wollen:
dir | find "<"
Oder das Anzeigen aller Dateien, die im September erstellt wurde:
dir | find ".09."
Wichtig ist nur, eine signifikante Zeichenkette zu finden, die die entsprechenden Zeilen von allen anderen unterscheidet.
Statt als Filter kann man FIND auch als eigenständiges Programm verwenden, etwa um die Zeilen dieses Lehrmaterials zu zählen, in denen das Wort "DOS" vorkommt:
find /c "DOS" dos4.doc
Die Antwort ist
dos4.doc: 14
Bis jetzt kann also in 14 Zeilen das Wort "DOS" vor, was nicht unbedingt bedeutet daß es nur 14mal im Text Verwendung fand, da es ja auch mehrmals auf einer Zeile stehen kann und dann nur einmal gezählt wird. Es wird - wie schon erwähnt - zeilenweise gearbeitet.
Durch Leerzeichen getrennt können auch mehrere Dateien aufgeführt werden, die dann nacheinander durchmustert werden; der Einsatz von Jokern für Dateiengruppen ist aber nicht erlaubt.
Niemand hindert Sie, ihre Daten durch beliebig viele Filter zu schicken, beispielsweise um alle Dateien, die nicht die Erweiterung DOC haben, nach Namen sortiert seitenweise auf den Bildschirm auszugeben:
dir | find /v "DOC" | sort | more
Sie werden bemerken, daß die Ausführung etwas länger dauert, denn DOS baut intern Hilfsdateien auf, in denen gesucht und sortiert wird. Diese temporären Dateien werden automatisch gelöscht, können aber unter Umständen bei einem Absturz oder einem Reset während der Abarbeitung zurückbleiben. Der Name dieser Dateien mutet seltsam an (z.Bsp. Oe14081a), weil er bei neueren Betriebssystemversionen aus der Zeit gebildet wird, um im Netzbetrieb nicht zu kollidieren.
Denken Sie nur nicht, Filter seien eine komplizierte Sache. Jeder kann sich mit einfachen Mitteln selbst welche schreiben. Diese Programme müssen den Datenstrom von der Standardeingabe einlesen, ihre Aufgabe ausführen und wieder zur Standardausgabe schreiben. Sehen Sie, wie kurz ein Pascal-Programm ist, das - als Filter verwendet - Texte mit Zeilennummern versieht:

PROGRAM number;
VAR zeile : string;
i : integer;
BEGIN
i:=1;
WHILE NOT EOF DO BEGIN
READLN(zeile);
WRITELN(i:3,'     ',zeile;
i:=i+1;
END;
END.

Durch dieses Filter können jetzt beliebige Texte geschickt werden, z.Bsp. das Inhaltsverzeichnis mit
dir | number
oder auch dieser Kurs:
type dos4.doc | number
Es ist auch kein Problem den Text mit Zeilennummern wieder abzuspeichern:
number < dos4.doc > dos4num.doc
Mit Hilfe des Kleiner- und Größerzeichens wird der Ein- und Ausgabestrom durch das Filter geleitet. Unter dem Namen "dos4num.doc" steht der nummerierte Text wieder auf der Platte. Auf diese Art und Weise können Sie sich ganz leicht beliebige Filter selbst schreiben.
Filter können weiterhin dazu verwendet werden, Rückfragen von Befehlen zu begegnen. Wenn am Ende einer Sitzung nach dem Sichern stets alle Dateien gelöscht werden sollen, so erzeugt der Befehl "del *.*" stets die Ausschrift "Wirklich löschen (J/N)", was in einer BAT-Datei lästig sein kann. Mit
echo j|del *.*
wird nicht angehalten. Etwas schwerer ist es schon, Befehle zu bedienen, die nur ein <ENTER> erwarten, zum Beispiel FORMAT. Der Befehl
echo.| Format a:
beginnt mit dem Formatieren, ohne auf Tastendruck zu warten. Zwischen Punkt und senkrechtem Strich darf kein Leerzeichen stehen. Auch DATE und TIME warten stets auf das Drücken der ENTER-Taste, wenn Datum oder Zeit nur angezeigt werden sollen. Kein Problem mit
echo.| time
Und wenn nur die Zeile mit der Zeit gefragt ist, so filtert man den Rest einfach weg:
echo.| time | find "."
Natürlich gibt das nur in Batchdateien richtig Sinn. Ein <ENTER> kann übrigens auch mit dem MORE-Filter erzeugt werden. Damit wird ausgenutzt, das es stets eine Leerzeile einfügt. Statt des oben beschriebenen Befehls kann so auch
echo | more | time
geschrieben werden.
Wie Sie sehen, muß man manchmal schon ganz schöne Klimmzüge veranstalten, um elegante Lösungen zu erreichen, aber die DOS-Kommandosprache ist halt recht klein - dafür aber leicht zu erlernen.

(c) Jürgen Richter