8.6 Formatierte Ausgabe
awk kann Daten formatiert ausgeben. Hierzu wird die Anweisung printf verwendet.
printf "format" expr-list...
- Das Format kann als String oder als Variable übergeben werden.
- Für jeden auszugebenden Wert der expr-list muß; eine Formatspezifikation im Format enthalten sein.
- Die Formatspezifikation legt die Konvertierung und die Feldlänge fest.
- Spezifikation Konvertierung
%c Character, Einzelzeichen
%d Integer
%e Gleitkomma, Eponentialschreibweise [-]d.ddddddE[+-dd]
%f Gleitkomma, Ausgabe mit 6 Nachkommastellen [-]ddd.dddddd
abhängig von CONVFMT)
%g Gleitkomma, kürzere Darstellung (e oder g)
%s Stringausgabe
%o Oktale Ausgabe
%x Hexadezimale Ausgabe
- Die Feldlänge width und die Ausrichtung wird mit der Formatspezifikation angegeben
Die angegebene Feldlänge ist eine Mindestgröße. Reicht der Platz bei numerischer Ausgabe nicht aus, so nimmt der awk die erforderlichen Stellen. Die Anzahl der Nachkommastellen wird mit .prec angegeben %[-]width[.prec] - linksbündige Ausrichtung des expr im Ausgabefeld width Feldlängenangabe .prec Genauigkeit nach dem Dezimaltrennzeichen %6.2f 6 Stellen für die gesamte Auasgabe davon 2 Nachchkommastellen, ein . (Punkt) als Dezimaltrennzeichen, es verbleiben somit nur 3 Stellen für den ganzzahligen Teil
Format expr Ausgabe
printf "|%d|\n",99/2 |49|
printf "|%6d|\n",99/2 | 49|
printf "|%06d|\n", 99/2 |000049|
printf "|%-6d|\n", 99/2 |49 |
printf "|%f|\n", 99/2 |49.500000|
printf "|%6.2f|\n", 99/2 | 49.50|
printf "|%-6.2f|\n", 99/2 |49.50 |
printf "|%06.2f|\n", 99/2 |049.50|
printf "|%e|\n", 99/2 |4.950000e+01|
printf "|%14.5e|\n", 99/2 | 4.95000e+01|
printf "|%-14.5e|\n", 99/2 |4.95000e+01 |
printf "|%014.5e|\n", 99/2 |0004.95000e+01|
printf "|%g|\n", 99/2 |49.5|
printf "|%12g|\n", 99/2 | 49.5|
printf "|%12.7g|\n", 99/2 | 49.5|
printf "|%-2.7g|\n", 99/2 |49.5 |
printf "|%x|\n", 240 |f0|
printf "|%4x|\n", 240 | f0|
printf "|%4X|\n", 240 | F0|
printf "|%s|\n", "D.Hahn" |D. Hahn|
printf "|%10s|\n", "D.Hahn" | D. Hahn|
printf "|%-10s|\n", "D.Hahn" |D. Hahn |
printf "|%10.3s|\n", "D.Hahn" | D. |
8.6.1 Plattenbelegung Aufgabenstellung
Ein Script soll allen Plattenplatz ermitteln den ein User belegt.
- Der Username sollte als Parameter übergeben oder vom Script ermittelt werden
- Die Summierung soll ab einem vorgegebenen Verzeichnis oder ab dem augenblicklichen Verzeichnis ermittelt werden.
8.6.2 Plattenbelegung Lösung
<#! /bin/sh # -------------------------------------------------------------------------- # Erzeugt : 20.03.97 # Autor : Detlef Hahn # Beschreibung : Das Script ermittelt den verbrauchten Plattenplatz # für einen Anwender im übergebenen Verzeichnisbaum # -------------------------------------------------------------------------- # Modif.Log : #_========================================================================== # -------------------------------------------------------------------------- # Mainscript disk_use # -------------------------------------------------------------------------- [ $# -ge 1 ] && user=$1 || user=`logname` [ $# -eq 2 ] && dir=$2 || dir=`pwd` ls -laR $dir 2> /dev/null | awk -v user=$user -v dir=$dir ' BEGIN { print "\nPlattenverbrauch ", user," ab Verzeichnis : ",dir print "Stand : " strftime("%d.%m.%y") } /^-/ { sum_file = sum_file + $5 # Summe traditionell anz_file = anz_file + 1 # hochzählen traditionell next # Nächsten Satz lesen } # Verzeichnisse bearbeiten dabei . und .. ausblenden $1~/^d/ && $3~user && $9~/^[^\.]/ { # { muß hinter Condition sonst # wird bei jedem Satz verarbeitet sum_dir += $5 # Summe C-like bilden anz_dirs++ # hochzählen C-like } END { printf "%6d Normale Dateien %12d = %9.1f MB\n",anz_file, sum_file, sum_file / (1024 * 1024) printf "%6d Verzeichnisse %12d\n",anz_dirs, sum_dir } ' $ awk/disk_usage.sh "detlef" /data/htdocs/ Plattenverbrauch detlef ab Verzeichnis : /data/htdocs/ Stand : 19.09.22 51155 Normale Dateien 4577040054 4365.0 MB 9243 Verzeichnisse 848522 $ du -hs /data/htdocs 4,4G /data/htdocs