AWK

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Die Seite wurde geleert.)
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 ) }'
 

Version vom 20. Dezember 2011, 00:05 Uhr

Meine Werkzeuge