AWK
(Die Seite wurde neu angelegt: Ausgangsbasis ist das Übungsshellskript für ein grafisches '''df''', welches folgende Ausgabe erzeugt: Mounted Use% / 19% #########---------------...) |
K |
||
Zeile 61: | Zeile 61: | ||
# Prozentwert vom Prozentzeichen trennen (geht das mit awk noch besser?), halbieren und als Ganzzahl zurückgeben: | # 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); | d=int(substr($5,1,length($5)-1)/2); | ||
+ | |||
# Bargraph leeren: | # Bargraph leeren: | ||
b=""; | b=""; | ||
+ | |||
# mit dem used-Anteil füllen: | # mit dem used-Anteil füllen: | ||
{ for(i=1; i<=d; i++) b=b"#" }; | { for(i=1; i<=d; i++) b=b"#" }; | ||
+ | |||
# auffüllen bis 50 Zeichen: | # auffüllen bis 50 Zeichen: | ||
{ for(i=d; i<=50; i++) b=b"-" }; | { for(i=d; i<=50; i++) b=b"-" }; | ||
+ | |||
# Ausgabe ergänzen: | # Ausgabe ergänzen: | ||
printf("%-12s %4s %s\n", $6, $5, b ) | printf("%-12s %4s %s\n", $6, $5, b ) |
Version vom 12. November 2010, 11:55 Uhr
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 (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 ) }'