8.12 Diskqouta Aufgabenstellungen

Es soll per awk der verbrauchte Plattenplatz für alle Benutzer ermittelt werden. In awk wird eine assoziative Tabelle verwendet, um die Daten für jeden User zu speichern.

8.12.1 Diskqutota Lösung

  
#! /bin/ksh # ----------------------------------------------------------------------------------- # Erzeugt : 20.02.97 # Autor : Detlef Hahn # Beschreibung : Das Script ermittelt den verbrauchten Plattenplatz # für alle user # ------------------------------------------------------------------------------------ # Modif.Log : #_============================================================= FPATH=/usr/local/lib/func_lib:/root/lib/func_lib autoload kopf # ------------------------------------------------------------------------------------ # Definieren Sie nachfolgend Ihre eigenen Funktionen # ------------------------------------------------------------------------------------ usage() { echo " Das Script ermittelt unter Verwendung von awk den " echo " Plattenverbrauch der Anwender ab dem 'Current Dir'" echo " oder ab einem vorgegebenen Verzeichnis" echo " usage $0 [-?] [path] " echo " ----------------------------------------------------" } # ----------------------------------------------------------------------------------- # Mainscript disk_use # ----------------------------------------------------------------------------------- kopf "Plattenbenutzung User" echo if [ "$1" = "-?" ] then usage shift # ok dann ab current directory fi dir="." if [ $# -gt 0 ] then dir=$1 fi # # # --------------------------------------------------------------------------------- # awk ist ein Filter und liest von stdin und gibt auf stdout aus. # Dem awk können Werte in der Form var=value übergeben werden # Da das awk-script nicht in einer separaten Datei abgelegt ist, muß # es in ' ' eingeschlossen werden. # --------------------------------------------------------------------------------- # ls -lR ${dir} 2> /dev/null | awk -v dir=$dir ' # Die Action unter dem pattern BEGIN wird durchgeführt, bevor der erste Satz # gelesen wird. awk erlaubt mehrere BEGIN-pattern die auch nicht am Anfang # aufgeführt sein müssen. BEGIN { printf "%s Moment mal ...\n", strftime("%d.%m. %H:%M:%S",systime()) printf "da muß ich ja ab %s die gesamte Platte lesen\n",dir printf "-------------------------------------------\n" printf " User Dirs Files Bytes \n" anz = 0 # nicht erforderlich, da automatisch typgerecht total = 0 # initialisiert wird } # ------------------------------------------------------------------------ # Das Pattern vor der Action ist eine Bedingung. Sie entscheidet, ob der # Actionteil durchgeführt wird. # Im Bedingungsteil können Regular Expression angegeben werden # /RE/ {action} # der RE gilt für die gesamte Zeile # Die öffnende geschweifte Klammer muß unmittelbar # hinter der Bedingung in der gleichen Zeile folgen, # da sonst eine bedingunglose Action definiert würde. # $1 ~ /RE/ {action} # der RE gilt für Felder oder Variablen # ~ # der Operator ~ (Tilde) steht für trifft zu # !~ # der Operator !~ steht für trifft nicht zu # /RE/ # steht nur eine Bedingung und keine Action wird der # Satz bei erfüller Bedingung ausgegeben # {aktion} # Eine bedingundlose Action wird für jeden Satz # durchgeführt $1 ~ /^d/ && $1 ~ /^[^\.]/ { dirs[$3]+=1 # assoziatives array bytes[$3]+=$5 # Länge ermitteln next # keine weitere Verarbeitung des Satzes } # sofort Folgesatz lesen # Ist keine Bedingung angegeben, dann wird die Action für jeden Satz # durchgeführt. # Die Anzahl der Felder muß hier > 2 sein, da der rekursive ls Leerzeilen # und Summenzeilen liefert. Diese dürfen nicht mit eingehen. NF > 2 { user = $3 # Umspeichern in Variable (nicht erforderlich) bytes[user]+=$5 # assoziatives array files[user]++ # normale Dateien, Links, usw # printf ("%d %s\n",files[user],$0) } # -------------------------------------------------------------------------------- # Die Action unter der Bedingung END wird durchgeführt, nachdem EOF erkannt # wurde. Es können (wie bei BEGIN) mehrere END vorhanden sein. Die müssen # auch nicht am Schluß stehen. END { for (user in bytes) { anz+=1 printf(" %-8s %8d %8d %10d \n", user,dirs[user],files[user],bytes[user]) total_bytes += bytes[user] total_files += files[user] total_dirs += dirs[user] } printf("-------------------------------------------\n") printf("Gesamt %8d %8d %11d\n",total_dirs, total_files, total_bytes) } END { printf "%s Geschafft\n", strftime("%d.%m. %H:%M:%S",systime()) } ' # # -------------------------------------------------------------------------------- #