Übungen zu ``Shellprogrammierung''


Sommersemester 97

Blatt 9 vom: 23.6.97
letzter Abgabetermin: 30.6.97 (vor 10.00 Uhr)

Aufgabe 1 (1 Punkt)

a)
Geben Sie mit pwd, dirname und basename die viertletzte Komponente des aktuellen Pfads aus.
b)
Geben Sie mit Hilfe von pwd, IFS, set, eval, echo, test, shift und epxr die vorletzte Komponente des aktuellen Pfads aus. Ihre Lösung soll lediglich aus einer Zeile bestehen und darf basename und dirname nicht verwenden.

Aufgabe 2 (1 Punkt)

Machen Sie sich mit awk und dem Kapitel 10 des Vorlesungs-Skripts vertraut. Erklären Sie Ihrem Tutor die Skripte 10.awk_5 und 10.awk_6. Was ist die Eingabe für awk, wo liegen die Unterschiede in der Ausgabe, und wie kommt es dazu?

Schreiben Sie ein Skript rcat.

Usage: rcat [FILE]...
Concatenate FILE(s), or standard input, to standard output in reversed order.
With no FILE, or when FILE is -, read standard input.

Das Skript soll die gleiche Funktionalität wie cat haben, außer, daß alle Zeilen in der umgekehrten Reihenfolge ausgegeben werden.

Aufgabe 3 (3 Punkte)

Prüfen Sie mit einem awk-Skript Ihre Archivdatei aus Aufgabe 5 vom Blatt 8 auf Konsistenz. So sollte z.B. (je nach Implementation Ihres Extraktions-Skripts) der Dateiname in der Ausgabe von ls -l und wc gleich sein, es sollte keine Zeile mit einem Backslash am Ende fortgesetzt werden, Dateinamen sollten keine Zeichen wie Leerzeichen, Tab oder Slash enthalten, im Mode-Feld darf kein t- und s-Bit gesetzt sein, und nach einem Datenblock muß eine ls -l-Zeile folgen.

Aufgabe 4 (2 Punkte)

Machen Sie sich mit dem awk-Skript zu Kapitel 10.23 (Argumente IV) und 10.15 (Getline < file) vertraut. Wozu dient in 10.15 das $0 in der letzten Zeile? Was würde sich ändern, wenn man es wegläßt? Wozu wird in 10.23 ARGV[i]="" aufgerufen? Was würde sich ändern, wenn man diese Zeile wegläßt?

Aufgabe 5 (1 Punkt)

Machen Sie sich mit dem awk-Skript zu Kapitel 10.13 (Kommunikation III) vertraut, und erklären Sie Ihrem Tutor die Kommunikation zwischen der Shell und awk.

Schreiben Sie darauf aufbauend ein Skript, welches einen oder mehrere Gruppennamen bekommt und für alle korrekten Gruppennamen folgende Ausgabe erzeugt:

$ getGroupId inform sths stds
GID_inform=11; GID_sths=31; 
stds is not a correct groupname

Wird die Ausgabe mit eval verarbeitet, so sind die jeweiligen Variablen gesetzt:

$ eval `getGroupId inform sths stds 2>/dev/null`
$ echo $GID_inform $GID_sths
11 31

Ihre Lösung darf nur einmal awk aufrufen!

Aufgabe 6 (2 Punkte)

Mit dem Kommando xntpdc kann man einen Rechner nach der zeitlichen Abweichung zu seinen Stratum-Servern fragen:

$ xntpdc -p lyra
     remote           local      st poll reach  delay   offset    disp
=======================================================================
*thor            131.173.12.107   2   64  377 0.00291 -0.086771 0.00258
+aton.informatik 0.0.0.0          2 1024    0 0.00299 -0.062835 16.0000
+rudra.informati 131.173.12.107   2   64  377 0.00154 -0.039932 0.00400
$ xntpdc -p indra
     remote           local      st poll reach  delay   offset    disp
=======================================================================
+thor            131.173.12.51    2  256  377 0.00261 -0.020967 0.01996
+aton.informatik 0.0.0.0          2 1024    0 0.00288  0.029116 16.0000
*rudra.informati 131.173.12.51    2  256  377 0.00139  0.026863 0.01572

Die offset-Spalte enthält die Abweichnung in Sekunden.

Schreiben Sie ein Skript, welches als Argument einen Netznamen (applied, lehre oder praxis) bekommt und dann den Rechner mit der betraglich größten Abweichung ausgibt.