| 
			   | 
			
| (8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | 
| Zeile 1: | 
Zeile 1: | 
| − | Ausgangsbasis ist das Übungsshellskript für ein grafisches '''df''', welches folgende Ausgabe erzeugt:
  | + | [[Category:Programmierung]]  | 
| − |    | + | [[Grafische Ausgabe von df]]  | 
| − |  Mounted      Use%
  | + |  | 
| − |  /             19% #########------------------------------------------
  | + |  | 
| − |  /boot         10% #####----------------------------------------------
  | + |  | 
| − |  /home          7% ###------------------------------------------------
  | + |  | 
| − |  /tmp           2% #--------------------------------------------------
  | + |  | 
| − |  /var          20% ##########-----------------------------------------
  | + |  | 
| − |    | + |  | 
| − | D.h. es soll der Mountpoint und die prozentuale Belegung inkl. Überschrift und einem 50 Zeichen langen Bargraph angezeigt werden.
  | + |  | 
| − | Es sollen nur "echte" lokale Dateisysteme angezeigt werden.
  | + |  | 
| − |    | + |  | 
| − | Das Ursprungsskript:
  | + |  | 
| − |  #! /bin/bash
  | + |  | 
| − |  
  | + |  | 
| − |  LANG=C
  | + |  | 
| − |  # gdf -- "Grafische" Ausgabe von df
  | + |  | 
| − |  hash="############################################################"
  | + |  | 
| − |  dash="------------------------------------------------------------"
  | + |  | 
| − |  df -P "$@" | tr -s ' ' '\t' | cut -f1,5,6 | while read x pct fs
  | + |  | 
| − |  do
  | + |  | 
| − |     (echo "$x" | grep -qv "^/" -) && continue
  | + |  | 
| − |     printf "%-12s %4s " $fs $pct
  | + |  | 
| − |     if [ "$pct" != "Use%" ]
  | + |  | 
| − |     then
  | + |  | 
| − |         usedc=$((${#hash}*${pct%\%}/100))
  | + |  | 
| − |         echo "${hash:0:$usedc}${dash:0:${#hash}-$usedc}"
  | + |  | 
| − |     else
  | + |  | 
| − |         echo ""
  | + |  | 
| − |     fi
  | + |  | 
| − |  done
  | + |  | 
| − |    | + |  | 
| − |    | + |  | 
| − | Die erste Optimierung (von Daniel Graf):
  | + |  | 
| − |  #!/bin/bash
  | + |  | 
| − |  
  | + |  | 
| − |  while read part size ; do
  | + |  | 
| − |    echo -ne ${part}"\t"${size}"\t"
  | + |  | 
| − |    size=$((${size%\%}/2))
  | + |  | 
| − |    for dash_count in `seq 1 $size` ; do
  | + |  | 
| − |      echo -n '#'
  | + |  | 
| − |    done
  | + |  | 
| − |    for minus_count in `seq 1 $((50-size))` ; do
  | + |  | 
| − |      echo -n '-'
  | + |  | 
| − |    done
  | + |  | 
| − |    echo
  | + |  | 
| − |  done < <(df | egrep "^/" | awk {'print $6" "$5'})
  | + |  | 
| − |    | + |  | 
| − | Statt '''tr''' und '''cut''' wurde '''awk''' zum selektieren der Felder verwendet. Die Überschrift fehlt in diesem Falle aber.
  | + |  | 
| − |    | + |  | 
| − | '''awk''' kann allerdings auch selbst eine formatierte Ausgabe erzeugen. Die ersten beiden anzuzeigenden Spalten waren somit auch ohne Schleife zu erzeugen:
  | + |  | 
| − |  df | awk '$1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
  | + |  | 
| − |    | + |  | 
| − | Die sprachunabhängige Kopfzeile dazu wäre:
  | + |  | 
| − |  df | head -1 | awk '{ printf("%-12s %4s\n", $6, $5) }'
  | + |  | 
| − |    | + |  | 
| − | Das sollte doch auch noch im selben df durch awk zu erledigen zu sein:
  | + |  | 
| − |  df | head -1 | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
  | + |  | 
| − |    | + |  | 
| − | Nun zum dynamisch erzeugten Bargraphen:
  | + |  | 
| − |  # Prozentwert vom Prozentzeichen trennen (geht das mit awk noch besser?), halbieren und als Ganzzahl zurückgeben:
  | + |  | 
| − |  d=int(substr($5,1,length($5)-1)/2);
  | + |  | 
| − |  # Bargraph leeren:
  | + |  | 
| − |  b="";
  | + |  | 
| − |  # mit dem used-Anteil füllen:
  | + |  | 
| − |  { for(i=1; i<=d; i++) b=b"#" };
  | + |  | 
| − |  # auffüllen bis 50 Zeichen:
  | + |  | 
| − |  { for(i=d; i<=50; i++) b=b"-" };
  | + |  | 
| − |  # Ausgabe ergänzen:
  | + |  | 
| − |  printf("%-12s %4s %s\n", $6, $5, b )
  | + |  | 
| − |    | + |  | 
| − | Die Erzeugung des Bargraphen ist möglicherweise auch noch zu verbessern.
  | + |  | 
| − |    | + |  | 
| − | Der endgültige Einzeiler:
  | + |  | 
| − |  df | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { d=int(substr($5,1,length($5)-1)/2); \
  | + |  | 
| − |  b=""; { for(i=1; i<=d; i++) b=b"#" }; { for(i=d; i<=50; i++) b=b"-" }; printf("%-12s %4s %s\n", $6, $5, b ) }'
  | + |  |