340 likes | 412 Views
THEMA. Der Sort- Find- und Grepmechanismus unter UNIX. Der Mechanismus von sort, grep und find unter UNIX.
E N D
THEMA • Der Sort- Find- und Grepmechanismus unter UNIX
Der Mechanismus von sort, grep und find unter UNIX • Die drei sind alle normale, ausführbare Programme, die bestimmt zum teil sehr komplexe Funktionen realisieren und mit dem UNIX-Betriebssystem ausgeliefert. Um zu ihrem mechanismus zu gehen wollen wir das Thema „Shell“ befassen.
Shell • Sie legt sich wie eine Schale um den Betriebssystemkern und ermöglicht dem Benutzer im Dialog seine Anweisungen an UNIX abzusetzen. Betriebs- system kern Betriebs- system kern
Die wesentlichen Aufgaben der Shell kann man in sechs Bereiche unterteilen: 1 6 Betriebs- system kern 2 5 3 4
Angaben ①-Analysieren der Kommandoeingabe ②-Suchen nach dem angegebenen Kommando ③-Steuerung der Ein-und Ausgabe Pipever-arbeitung ④-Ersetzen von Sonderzeichen ⑤-Steuerung des Ablaufs (wenn...dann..u.s.w) ⑥-Erzeugen des Sohnprozesses vorder-und Hintergrundprozesses
Aufruf von Kommandos und die Aufgaben der Shell Zum ①: was wurde eingegeben? -Die Shell analysiert die Eingabe wie folgt: ls -l ../hans -Die Shell nimmt das 1.Wort der eingegebenen Zeile als Kommando und sucht das dazugehörige Programm. Diesem übergibt es den Rest der Zeile als Anweisung. Im obigen Beispiel wird „ls“ gesucht und das gefundene ls-Programm mit den Parametern „-l ../hans“ aufgerufen. An dem vorangestellten „-“ bei „-l“ erkennt das ls-Programm nun, daß der erste Parameter eine Option ist. Alle nicht mit „-“ beginnenden Parameter werden von ls als Dateiname oder Directory betrachtet. Zwischen dem Kommando, der Option und dem Parameter müssen als Trennung mindestens 1 Leerzeichen oder Tabulatorzeichen stehen. 1.Wort=Kommando Option Parameter
zum②: wo findet nun die Shell das ls-Programm? Gibt es das Kommando überhaupt? Die Shell sucht in bestimmten Directories nach „ausführbaren“ Dateien mit dem angegebenen Namen. Für jeden Benutzer ist ein PATH(Suchpfad) eingerichtet, der die Namen der Directories enthält, die dabei durchsucht werden sollen. Die zumeist unter PATH vorgegebenen Directories sind: /bin /usr/bin /usr/ucb /usr/local Unter diesen directories sind die Kommandos für den „normalen“ Benutzer abgelegt. Dieser Suchpfad kann für jeden Benutzer abgeändert werden
zum③: Das UNIX-System ist als Dialogsystem konzipiert, d.h. jeder Benutzer kann direkt von seinem Arbeitsplatz (dem Terminal) Kommandos aufrufen,und das Ergebnis wird in der Regel auf seinem Bildschirm angezeigt. Die Standardein- und ausgabe ist das Benutzerterminal Durch einfache Steuerzeichen in der Shell kann die Ein- und Ausgabe umgeleitet werden. So bedeutet das Größer-Zeichen „>“ Umleitung nach,das Kleiner-Zeichen „<„ Umleitung von. Soll die Liste der Dateienvon /usr/kurs/hans nicht am Bildschirm angezeigt werden, sondern in eine Datei auf der Platte mit dem Namen inhalt geschrieben werden, heißt der Aufruf: ls -l ../hans > inhalt
zum④: Die Shell erleichtert Ihnen die Zusammenarbeit mit dem Rechner. So gibt es eine Reihe von Sonderzeichen, die u.a. verwendet werden,um lange Datei- und Pfadnamen abzukürzen. Sie können der Shell z.B.sagen: „Ich meine alle Dateien, deren Namen mit a oder b oder c anfangen.“ Das * steht z.B. für eine beliebige Zeichenfolge. Gibt es unter /usr/kurs/monika kein anderes Directory beginnend mit „b“ kann der Aufruf statt ls -l befehle auch mit ls -l b* erfolgen
zum⑤: Hier können Sie die Ausführung eines oder mehrerer Kommandos davon abhängig machen, ob vorab bestimmte Bedingungen erfüllt wurde. Z.B. können Sie vorab prüfen, ob überhaupt ein Directory /urs/kurs/hans vorhanden ist; wenn ja, soll das Inhaltsverzeichnis, das Sie mit ls bekommen, in eine Datei mit dem Namen inhalt geschrieben werden. zum⑥: Das aufgefundene Kommando wird als eigenes Programm gestartet. Hierbei gibt die Shell alles Wissenswerte (u.a. unter welchem Namen hat sich der Benutzer angemeldet? Wo ist sein Homedirectory? ) an das nächste Programm weiter. Ähnlich der Dateistruktur sind auch die Programme hierarchisch geordnet. Man spricht hierbei von Vater/Sohnprogrammen
Bereitzeichen der Shell Sobald die Shell alle Ihre Aufgaben ordnungsgemäß erfüllt hat, meldet sie sofort wieder an Ihrem Bildschirm, daß sie bereit ist, weitere Aufträge von Ihnen entgegenzunehmen. Auf dem Bildschirm erscheint für den normalen Benutzer das Bereitzeichen, z.B. „$“, für den Systemverwalter z.B. „#“. Erkennt die Shell, daß noch weitere Angaben für einen Kommandoaufruf notwendig sind, gibt sie das Zeichen „>“ aus. $---------------------- Bereitzeichen für den normalen Benutzer Bereitzeichen für den normalen Benutzer #--------------------- Bereitzeichen für den Systemverwalter >--------------------- Kennzeichen, daß die Shell weitere Ein- gaben für einen Kommandoaufruf er- wartet
Der Sortmechanismus unter UNIX • Sicher haben Sie schon bemerkt, daß alle Dateien eines Directories mit ls standardmäßig alphabetisch sortiert werden. Enthält Ihr Directory Dateinamen, die mit Groß- und Kleinbuchstaben beginnen, so werden zuerst die mit Großbuchstaben beginnende Dateien angezeigt, dann erst alle Dateien, deren Namen mit Kleinbuchstaben anfängt. • Verbinden Sie das ls-Kommando durch eine Pipe mit einem Sortierprogramm, können Sie sich z.B. die Ausgaben des Inhaltverzeichnisses so sortieren lassen, daß Groß- und Kleinbuchstaben gleichwertig alphabetisch sortiert werden.
sort[-f r n] [Dateiname(n)] • Ebenso können Sie die Dateien mit Hilfe des Sortierprogrammes zeilenweise alphabetisch sortieren-z.B. um fast mühelos ein Telefonverzeichnis anzulegen. Lernen Sie deshalb ein paar nützliche Kommandos, die Sie als Filter für Textdateien verwenden können: • numeric string • Am Zeilenanfang beginnende Zahlen, die durch • Leerzeichen von anderen Zeichen getrennt sind, • werden in arithmetischer Reihenfolge sortiert . • Die Sortierung erfolgt umgekehrt • fold lower case letters in upper case( Klein- u. • Großbuchstaben gleichberechtigt) • sortieren • Kommando, um Datei-Inhalte zu sortieren
Beispiel Pipe mit Sortprogramm $ ls Datum befehle inhalt neu projektA ueb1 $ ls | sort -f befehle Datum inhalt neu projektA ueb1
Der Grepmechanismus unter UNIX • Bald werden Sie Ihren UNIX-Rechner gerne einsetzen, um z.B. auch Dokumentation jeglicher Art zu erstellen. Sie haben die Texte jederzeit im Zugriff, können Sie schnell verändern oder Teile (Textbausteine) davon in Angeboten und Briefen verwenden. Allerdings könnte es dann vorkommen, daß Sie nicht in mehr genau wissen, welchen Namen Sie einer bestimmten Datei gegeben haben. Sie erinnern sich aber genau an den Inhalt und wissen, daß Sie z.B. das Wort „mail“ benutzt haben. Mit dem Kommando „grep“ (in etwa greifen, heraussuchen) können Sie bestimmte Worte oder Zeichenfolgen aus Dateien oder Ergebnissen von Kommandos herausfiltern: (Zusammensetzung aus einer Editor Anweisung) Kommando, um nach Mustern in Datei-Inhalt zu suchen global regular expression print grep “Muster“ [Dateiname(n)]
Alle angegebenen Dateinamen werden nach dem vorgegeben Muster durchgesucht. Ist die Suche erfolgreich, wird der Dateiname und die Zeile mit dem gefundenen Muster angezeigt. • Beispiel: Suchen nach einem Muster (Wort) innerhalb von Dateien $ grep „mail“ Inhalt Datum neu neu: Wie bei dem Kommando mail muss das gefundene Zeile mit dem gesuchten Begriff Name der Datei, in der der gesuchte Begriff vorkommt
Beispiel zur Dateinamenexpansion durch Metazeichen • Um beispielweise festzustellen, in welcher Datei innerhalb des aktuellen Directory`s das Wort „mail“ vorkommt, können Sie folgendes Kommando geben: $ grep „mail“ * neu: Wie bei dem Kommando mail muß das Zeichen für Dateiende in einer eigenen Zeile stehen Die Shell ersetzt das * durch alle Dateinamen, die sie in dem aktuellen Directory findet: Datum befehle inhalt neu ueb1 projektA gefundene Zeile mit dem gesuchten Begriff Name der Datei, in der der gesuchte Begriff vorkommt
MAGIERKOMMANDO: grep [ -chilnv ] <regulaerer ausdruck> <name> [...] • BESCHREIBUNG: Sucht in den angegebenen Dateien nach dem angegebenen regulären Ausdruck. -c -- Gibt nur die Anzahl der gefundenen Zeilen pro Datei aus -h -- Gibt keinen Dateinamen aus -i -- Ignoriert Groß- und Kleinschreibung -l -- Zeigt immer einen Dateinamen an -n -- Gibt Zeilenummern zu den gefundenen Zeilen aus -v -- Gibt alle Zeilen aus, die nicht auf den Ausdruck passen
Der Findmechanismus unter UNIX • Manchmal geht es Ihnen, daß momentan nicht einfällt, wo Sie etwas hingeräumt haben und machen damit Problem. Hier haben Sie keine Angst! Auch für diese Situation gibt es unter UNIX hilfreiche Dienstprogramme. Nehmen wir an, daß wir eine Datei mit dem Namen “sichern“ hatten. Wir können uns aber nicht mehr erinnern, unter welchem Directory sie abgelegt ist. Wo fängt man an zu suchen? Nun, wir könnten bei unserem Home-Directory beginnen, mit ls uns die Dateien anzeigen lassen und alle vorkommenden „Unterdirectories“ auf die gleiche Weise durchforsten. Genau diesen Vorgang kann uns das Kommando find abnehmen. • Das find-Kommando hat allerdings seine Besonderheiten: - Sie müssen unbedingt angeben, von wo ab im Dateibaum gesucht werden soll(Start-Directory). - Die Optionen werden nicht abgekürzt sondern ausgeschrieben.
find Start-Directory [Suchkriterien/Muster] [Ausgabeart] - Wenn Sie ein Ergebnis angezeigt haben wollen, müssen Sie dies dem Kommando explizit angeben(Ausgabeart). • Doch sehen wir uns hierzu die Syntax(Regeln) an: *Start-Directory : relativer oder absoluter Pfadname des Directories, von dem ab gesucht soll *Suchkriterien/Muster: -name Dateiname -user Benutzername -mtime n(Anzahl der Tage) -never Dateiname Ohne Angabe von Suchkriterien werden alle Dateien gesucht und mit der Ausgabeart „-print“ angezeigt. *Ausgabeart: -print Anzeige der gefundenen Dateien -exec Befehl „ ; “ (ausführen) Ausführung der nachfolgenden Befehle. Ohne Angabe einer Ausgabeart ist das Kommando unsinnig
Beispiel: find /usr/kurs -name sicher -print Start-Directory Suchkriterium Ausgabeart Das find-Kommando gehört zu den schwierigeren Kommandos unter UNIX. Jede einzelne Position des Kommandos hat ihre Besonder-heiten. Betrachten wir diese der Reihe nach: • Start-Directory Es muß unbedingt angegeben sein. Wenn Sie von Ihrem aktuellen Directory suchen wollen, muß zumindest ein Punkt als Kennzeichnung des Start-directories angegeben werden. Die Pfadbezeichnung wird in gleicher Form den gefundenen Dateien mitgegeben. Haben Sie das Start-directory mit einem „ . “ angegeben, beginnen die gefundenen Namen ebenso mit ./ z.B. ./Befehle ./ Texte usw. Wurde als Start-directory „/usr/kurs“ angegeben, so werden die ge-fundenen Dateien ebenfalls mit dem absoluten Pfadnamen ausgegeben z.B. /usr/kurs/monika/Befehle /usr/kurs/monika/Texte, usw. Sie können auch mehrere start-directories angeben. Diese werden nacheinander, rekursiv durchgesucht.
Suchkriterien: Wie auch anderen Kommandos sind hier nur die Optionen ausgewählt worden, die häufig benötigt werden. Zu ihnen gehören (Bei den nachfolgenden Beispielen wird einfachheitshalber jeweils vom aktuellen Directory ausgehend gesucht): • -name datei: Der Dateiname wird durch ein Leerzeichen getrennt gleich nach der Option „-name“ eingegeben. Hierbei können Metazeichen wie *,? [ ] verwenden werden. Es ist jedoch wichtig, diesen mit Metazeichen versehenen Namen in Anführungszeichen zu setzen, damit er nicht sofort von der Shell ersetzt wird,sondern dem find-Kommando übergeben werden kann. Soll ab dem aktuellen Directory nach allen Namen gesucht werden, die „ n “ beginnen, so wird eingegeben: find . -name „ n* “ -print • -user benutzer: Auch hier wird anschließendan die Option der Name des Benutzers (so wie er in der Datei /etc/passwd eingetragen ist) ange-geben. Hier dürfen kein Metazeichen verwenden werden, da es sich hierbei nicht um einen Dateinamen handelt! Das find-Kommando sucht dann alle Dateien, dessen Besitzer der angegebene Benutzer ist.
-mtimen: (modification date). Mit dieser Option werden Dateien mit einem Bestimmten Modifikationsdatum gesucht. Unter n wird hierbei die Anzahl der Tage angegeben, die Ermittlung des gesuchten Datums führt, die genau vor n Tagen verändert wurden. Soll z.B. nach allen Dateien gesucht werden, die genau vor 2 Tagen verändert wurden, wird eingegeben: find . -mtime 2 -print • -mtime-n: Es wird nach allen Dateien gesucht, die innerhalb der n Tage verändert wurden. Sollen Beispielweise alle Dateien, die innerhalb der letzen 7 Tage ver-ändert wurden, gesucht werden, so wird eingegeben find . -mtime -7 -print • -mtime +n: Es wird nach Dateien gesucht, die vor n Tagen und noch früher verändert wurden. Wollen Sie feststellen, welche Dateien Sie vor 1 Monat und früher verändert haben, so geben Sie ein: find . -mtime +30 -print • -newer datei: Mit diesen Angabe wird nach allen Dateien gesucht, die ein jüngeres (neueres) Modifikationsdatum aufweisen, als die angegebene Datei.
Möchten Sie z.B. alle Dateien suchen, die Sie seit Ihrer letzten Sicherung verändert oder neuerstellt haben, so können Sie auf eine Datei abprüfen, die Sie zum zeitpunkt der Sicherung erstellt haben (z.B. sichlog). Die Eingabe lautet dann: find . -newer sichlog -print Ausgabeart: Bei denobigen Beispielen haben Sie sicher bemerkt, daß bei • -print :allen Aufrufen -print angegeben wurde. Sollten Sie vergessen, -print anzugeben, dann können Sie nicht sehen, welche Dateien gefunden wurden. • -exec : (execute- ausführen). Mit dieser Ausgabeart können Sie eine komman- dofolge angeben, die nach dem Suchvorgang durchgeführt werden soll. Hierbei können die gesuchten Dateien als Parameter (bzw. im pipe-Mechanis-mus) übergeben werden. Das Einsetzen der gefundenen Dateien wird mit der Zeichenfolge „ { } “ erreicht. Diese Option ist jedoch etwas kompliziert. Sie verlangt exakt die Einhaltung bestimmter Regeln: -exec Kommando „ { }“ „ ; “ Statt der in Anführungszeichen gesetzten geschweiften Klammern werden die gefundenen Dateien an dieser Stelle eingesetzt.
Das find-Kommando ist seiner „Feinheiten“ ein sehr häufig benutztes und wichtiges Kommando. Sie werden es hauptsächlich für die Sicherung Ihrer Dateien benötigen. Beachten Sie hierbei, daß die gefundenen Dateien immer mit der gleichen pfadbezeichnung beginnen, mit der Sie das Start-Directory angesprochen haben. Sehen wir uns hierzu die Beispiele an: $ find /usr/kurs -name sicher -print /usr/kurs/monika/Befehle/sicher $ cd $ pwd /usr/kurs/monika $ find . -name „ s*“ -print ./Texte/spruecher ./Befehle/sicher $ find . -print ./ProjektA ./ProjektA/beispiel.c . etc.. Angabe des gefundenen Dateinamens mit dem absoluten Pfadnamen /usr/kurs ..... Suche nach allen Namen mit „ s “ begin- nend Angabe der gefundenen Dateinamen mit dem relativen Pfadnamen ab Suchposi- tion ./ Anzeige aller Dateien mit dem Pfadnamen ab suchposition, die rekursiv in dem angegebenen Directory gefunden wurden.
Wenn Ihnen etwa nur der Anfangsbuchstabe einer Datei einfällt, nach der Sie suchen, so ist dies für das find-Kommando auch kein Problem. Sie können auch Verknüpfungen von Abfragen eingeben. Unter dem Anfangsbuchstaben „ n “ haben Sie vielleicht mehrere Dateien. Sie wissen aber, daß Sie die gesuchte Datei in den letzten 10 Tagen verändert haben. Geben Sie mehrere Suchkriterien an, so bedeutet dies, daß alle Angaben erfüllt sein müssen. Bei der Eingabe von find . -name „n*“ -mtime -10 -print müssen die zu suchenden Dateien mit n beginnen und zusätzlich innerhalb der letzten 10 Tage verändert worden sein. Eine oder-Verknüpfung ist möglich durch die Option -o. Wenn Sie Dateien suchen, die entweder mit „n“ oder mit „s“ beginnen, also beide angezeigt werden sollen, lautet der Aufruf find . “(‘‘ -name “o*“ -o -name “s*“ “)“ -print Die Klammer wirkt hier ähnlich wie in der Mathematik. Wichtig ist hierbei, daß die Klammer in Anführungszeichen steht und mit Leerzeichen von den anderen Eingaben getrennt wird, damit sie an das find-Kommando weitergegeben und nicht vorab durch die Shell interpretiert wird. Um die Sonderbedeutung der Klammer für die Shell zu unterbinden, kann auch das Fluchtsymbol \ jeweils vor die
Klammer gesetzt werden: find . \( -name “o*“ -o -name “s*“ \ ) -print Wenn nicht nur die gefundenen Dateinamen mit der Pfadbezeichnung angezeigt, sondern zusätzlich auch die Merkmale der Datei mit ls -l angezeigt werden sollen, so können Sie dem find-Kommando diese Aufgabe über die -exec-Anweisung mitgeben: $ pwd /usr/kurs/monika $ find . -name “n*“ -print -exec ls -l “ { } “ “ ; “ ........... $ find . -name “ n*“ -exec ls -l “ { }“ “ ; “ Die Anführungszeichen müssen eingegeben werden, damit Sonderzeichen nicht von der Shell vorab interpretiert werden. Wichtig sind auch die Leerzeichen zwischen den einzelnen Eingaben! Alle gefundenen Dateien werden als Parameter übernommen Ohne Angabe von -print wird nur das nachfolgende Kommando durch -exec ausgeführt
grep [-nf] “ Muster “ Dateiname(n) • Bild: Das war ein Beispiel von Suchen und Finden von Dateien (find mit -exec Funktion) • Ein weiteres Kommando, das Ihnen hilft, Dateien wiederzufinden,ist Groß- und Kleinbuchstaben gleichbehandeln numerierte Zeilenanzeige der gefundenen Zeilen in einer Datei global regular expression print (Zusammensetzung aus einer Editor Anweisung) Kommando, um nach Mustern in Datei-Inhalten zu suchen
Dieses Kommando ist schon kurz in einem Kapitel angesprochen. Falls man sich weder an der Dateinamen, noch an einen Teil des Namens erinnert, aber weiß, daß es sich bei dem Datei-Inhalt um einen Text handelt, in dem z.B. “Frosch“ vorkommt, dann kann man mit Hilfe des grep-Kommandos danach suchen: $ grep “Frosch“ `find . -print` ./Texte/sprueche: Iss jeden Tag einen lebenden Frosch - $ grep -n “Frosch“ `find . -print` ./Texte/sprueche:1: Iss jeden Tag einen lebenden Frosch - Durch die Sonderzeichen ` ` wird erst das Kom -mando find ausgeführt und alle gefundenen Dateien als Parameter dem Kommando grep übergeben. Mit Anzeige der laufenden Zeilennr.
Einige Informationen über awk-, gawk-und sed-Kommandos • Zum awk, gawk :Der Begriff awk leitet sich aus den Namen seiner Erfinder Aho/Weinberger/Kernighan ab. awk ist ein Programmierwerkzeug mit kommandozeilenorientiertem Aufruf und C-ähnlicher Syntax. Text-Dateien werden nach Textmustern untersucht, je nach Inhalt bearbeitet und mit den Ergebnissen wird eine neue Text-Datei (auf StdOut) ausgegeben. awk-Skripte werden anders als C-Programme nicht compiliert, sondern interpretiert. Sie sind schnell zu erstellen, aber langsam in der Ausführung. Sie eignen sich nur für kleine Aufgaben, da ein Debugger fehlt. • gawk.exe ist das unter Windows lauffähige Gnu-Kompilat von awk. • Zum sed.exec : sed (stream editor) ist ein nicht-interaktiver zeilenorientierter Editor. Das Ergebnis erscheint in Standard-Out.
Einige Informationen über compress-, tar- und gzip-Kommandos • Zum compress : • compress komprimiert Dateien mit LZW (einem veränderten Lempel-Ziv) Algorithmus. Bevor compress eine Datei durch die komprimierte Version ersetzt, überprüft es, ob die Datei nach der Kompression wirklich kleiner ist als vorher. Nur in diesem Fall wird die unkomprimierte Datei gelöscht. Wenn keine Datei angegeben wird, liest compress von der Standardeingabe und schreibt in die Standardausgabe. Wenn die Ausgabedatei Datei.Z schon existiert, wird sie nicht überschrieben. compress verändert den Zeitstempel der Datei nicht. • Das compress Programm kann als Standardpacker für Unix bezeichnet werden. Es wird im Zusammenhang mit tar auch für gepackte Dateiarchive verwendet. Das GNU tar bietet eine direkte Unterstützung von compress
Zum tar : • tar ist ursprünglich ein Tool zur Verwaltung von Bandarchiven. Das GNU- tar kann aber auch auf ''rohen'' Disketten oder in normalen Dateien Archive im tar Format anlegen und verwalten. Normalerweise werden Archive mit tar nicht komprimiert. Das GNU- tar kann aber die Ein- und Ausgabe durch einen Kompressor leiten. • Wenn auf der Kommandozeile keine Datei und kein Gerät angegeben ist, versucht tar auf die Gerätedatei eines Magnetbandgerätes zuzugreifen. Je nach Konfiguration ist das meist /dev/tape oder /dev/rmt0. Sie können eine andere Voreinstellung wählen, indem Sie die Umgebungsvariable TAPE mit dem Pfadnamen der entsprechenden Gerätedatei belegen.
Zum gzip : • Beschreibung • Programm zur Kompression und Dekompression von Dateien • nutzt das Lempel-Ziv-Verfahren LZ77 • erzielt deutliche höhere Kompressionsraten als compress • kann heute als De-facto-Standard im UNIX-Umfeld angesehen werden • ist in der Lage, mittels compress und zip komprimierte Dateien zu dekomprimieren • Default-Suffix für komprimierte Dateien: .gz • für Dekompression stehen alternative Aufrufe zur Verfügung: gunzip und zcat
awk • sed • mail • compress • gzip • tar • wc • at • crontab • tail, head