|
|
| Zeile 1: |
Zeile 1: |
| − | [[Category:AWK]]
| |
| − | [[Grafische" Ausgabe von df]]
| |
| | | | |
| − | Ausgangsbasis ist das Übungsshellskript für ein grafisches '''df''', welches folgende Ausgabe erzeugt:
| |
| − |
| |
| − | 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 (substr+length - geht das mit awk noch besser?), halbieren und als Ganzzahl (int) 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 )
| |
| − |
| |
| − | Wie kann man eine Folge von x Zeichen effektiver erzeugen?
| |
| − |
| |
| − | 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 ) }'
| |