Grafische Ausgabe von df

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (hat „Grafische" Ausgabe von df“ nach „Grafische Ausgabe von df“ verschoben)
 
Zeile 13: Zeile 13:
  
 
Das Ursprungsskript:
 
Das Ursprungsskript:
 +
<source lang="bash">
 
  #! /bin/bash
 
  #! /bin/bash
 
   
 
   
Zeile 31: Zeile 32:
 
     fi
 
     fi
 
  done
 
  done
 
+
</source>
  
 
Die erste Optimierung (von Daniel Graf):
 
Die erste Optimierung (von Daniel Graf):
 +
<source lang="bash">
 
  #!/bin/bash
 
  #!/bin/bash
 
   
 
   
Zeile 47: Zeile 49:
 
   echo
 
   echo
 
  done < <(df | egrep "^/" | awk {'print $6" "$5'})
 
  done < <(df | egrep "^/" | awk {'print $6" "$5'})
 
+
</source>
 
Statt '''tr''' und '''cut''' wurde '''awk''' zum selektieren der Felder verwendet. Die Überschrift fehlt in diesem Falle aber.
 
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:
 
'''awk''' kann allerdings auch selbst eine formatierte Ausgabe erzeugen. Die ersten beiden anzuzeigenden Spalten waren somit auch ohne Schleife zu erzeugen:
 +
<source lang="bash">
 
  df | awk '$1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
 
  df | awk '$1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
 
+
</source>
 
Die sprachunabhängige Kopfzeile dazu wäre:
 
Die sprachunabhängige Kopfzeile dazu wäre:
 +
<source lang="bash">
 
  df | head -1 | awk '{ printf("%-12s %4s\n", $6, $5) }'
 
  df | head -1 | awk '{ printf("%-12s %4s\n", $6, $5) }'
 +
</source>
  
 
Das sollte doch auch noch im selben df durch awk zu erledigen zu sein:
 
Das sollte doch auch noch im selben df durch awk zu erledigen zu sein:
 +
<source lang="bash">
 
  df | head -1 | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
 
  df | head -1 | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'
 +
</source>
  
 
Nun zum dynamisch erzeugten Bargraphen:
 
Nun zum dynamisch erzeugten Bargraphen:
 +
<source lang="bash">
 
  # Prozentwert vom Prozentzeichen trennen (substr+length - geht das mit awk noch besser?), halbieren und als Ganzzahl (int) zurückgeben:
 
  # 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);
 
  d=int(substr($5,1,length($5)-1)/2);
Zeile 74: Zeile 82:
 
  # Ausgabe ergänzen:
 
  # Ausgabe ergänzen:
 
  printf("%-12s %4s %s\n", $6, $5, b )
 
  printf("%-12s %4s %s\n", $6, $5, b )
 
+
</source>
 
Wie kann man eine Folge von x Zeichen effektiver erzeugen?
 
Wie kann man eine Folge von x Zeichen effektiver erzeugen?
  
 
Der endgültige Einzeiler:
 
Der endgültige Einzeiler:
 +
<source lang="bash">
 
  df | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { d=int(substr($5,1,length($5)-1)/2); \
 
  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 ) }'
 
  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 ) }'
 +
</source>

Aktuelle Version vom 20. Dezember 2011, 11:35 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: <source lang="bash">

#! /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

</source>

Die erste Optimierung (von Daniel Graf): <source lang="bash">

#!/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'})

</source> 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: <source lang="bash">

df | awk '$1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'

</source> Die sprachunabhängige Kopfzeile dazu wäre: <source lang="bash">

df | head -1 | awk '{ printf("%-12s %4s\n", $6, $5) }'

</source>

Das sollte doch auch noch im selben df durch awk zu erledigen zu sein: <source lang="bash">

df | head -1 | awk 'headline==0 { printf("%-12s %4s\n", $6, $5); headline=1 }; $1 ~ /^\/]*/ { printf("%-12s %4s\n", $6, $5) }'

</source>

Nun zum dynamisch erzeugten Bargraphen: <source lang="bash">

# 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 )

</source> Wie kann man eine Folge von x Zeichen effektiver erzeugen?

Der endgültige Einzeiler: <source lang="bash">

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 ) }'

</source>

Meine Werkzeuge