Übungen zu ``Shellprogrammierung''
Sommersemester 97
Blatt 9 vom: 23.6.97
letzter Abgabetermin: 30.6.97 (vor 10.00 Uhr)
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.
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.
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?
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!
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.