|
|
(3 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
− | [[Category:Awk]] | + | [[Category:Programmierung]] |
− | [[Grafische" Ausgabe von df]] | + | [[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 ) }'
| + | |