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, 00:29 Uhr

Grafische Ausgabe von df

Meine Werkzeuge