AWK

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (hat „Awk“ nach „AWK“ verschoben)
 
(6 dazwischenliegende Versionen von einem Benutzer 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 (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 ) }'
+

Aktuelle Version vom 20. Dezember 2011, 01:29 Uhr

Grafische Ausgabe von df

Meine Werkzeuge