Lösungen zu Kapitel 7
Die größten Programme
Es sollen die zehn größten ausführbaren Programme und Skripts in den Verzeichnissen der PATH-Variable in einer sortierten Top-Ten-Liste ausgegeben werden.
$ cat /tmp/script.sh #!/bin/bash MYPATH=`echo $PATH | tr : \ ` { for DIR in $MYPATH; do cd $DIR ls -lF | grep \* | awk '{ print $5 " " $9 }' done } | sort -n | uniq | tail –10 | sed s/*// | \ awk 'BEGIN { platz=10; } { print "Platz " platz-- ": " $2 " (" $1 " bytes)" }' $ /tmp/script.sh Platz 10: postgres (2336018 bytes) Platz 9: XF86_S3 (2357997 bytes) Platz 8: XF86_SVGA (2785184 bytes) Platz 7: scummvm (3138692 bytes) Platz 6: wine (3160548 bytes) Platz 5: Xnest (3749689 bytes) Platz 4: Xvfb (3943162 bytes) Platz 3: centericq (4244996 bytes) Platz 2: Xprt (4393472 bytes) Platz 1: lyx (5398916 bytes)
Listing B.6 a1-Lösung
Zur Lösung: Zunächst werden mittels tr alle Doppelpunkte aus der PATH-Variable entfernt. Diese neuen Werte legen wir in der Variable MYPATH ab. Mit einer for-Schleife durchlaufen wir diese Variable und geben die ausführbaren Dateien (mit einem * gekennzeichnet, den wir mittels grep filtern) an awk weiter. Dabei gibt awk nur die Größe der Datei und deren Namen aus.
Diese Ausgabe leiten wir als Kommandogruppe an sort weiter, das uns die Werte nach der Größe aufsteigend sortiert. uniq schmeißt alle doppelten Einträge heraus, und tail gibt nur die letzten 10 Einträge wieder. Daraufhin entfernen wir (und das ist auch nur Kosmetik) alle *-Zeichen der ausführbaren Dateien mit sed und leiten die Ausgabe an awk weiter.
Rausschmiss!
Die zweite Aufgabe bestand darin, eine Funktion zu schreiben, die Sie in die Startdatei Ihrer Shell integrieren können.
Diese Funktion sollte einen angemeldeten Benutzer aus dem System schmeißen, wozu alle Prozesse des Benutzers beendet werden müssen.
function killuser() { if [ `ps auxw | \ nawk '$1 ~ /'"${1}"'/ { print }' | \ wc -l | nawk '{ if($1<1) { print "0" } else { print "1" } }'` = 0 ]; then echo "alert: there are no procs!" else echo "--* killing the following processes *--" ps auxw| nawk '$1 ~ /'"${1}"'/ { print }' kill –9 `ps auxw | nawk '$1 ~ /'"${1}"'/ \ { print $2 }'` echo "---------------* done. *---------------" fi }
Listing B.7 killuser()