bash: Daten ausgeben mit printf
Mit Bash-Scripten kann man auch Informationen ausgeben und aufbereiten, die sonst nur durch die Eingabe mehrerer Befehle erlangbar wären. Ein solchen Script möchte ich jetzt im einzelnen näher vorstellen:
#!/bin/bash
```````````````````````````````````````#
#
# Zeigt Informationen über VirtualBox-Maschinen in tabellenform an.
#
```````````````````````````````````````#
printf "%-25s %-15s %5s %5s %5s %10s %5s %10s %-10s %-15s %-5s %-15s %-5s %-15s %s\n\n" "Name" "Typ" "Mem" "CPUs" "VRAM" "Used Mem" "PID" "CPU Load" "State" "Video" "Port" "Session" "User" "Clipboard" "UUID"
su vbox --shell=/bin/bash --command 'vboxmanage list vms' | cut -d\" -f2 | sort | while read line
do
# Erzeugen einer Liste der Maschineneigenschaften
su vbox --shell=/bin/bash --command "vboxmanage showvminfo '$line' --machinereadable" | grep '^[A-Za-z0-9_]*=' > /tmp/machine.txt
# Einlesen der Maschineneigenschaften zur Verwendung im Script
. /tmp/machine.txt > /dev/null
if [[ $VRDEStartTime ]]; then
date1=$(date --date="$VRDEStartTime" +"%s")
date2=$(date +"%s")
diff=$(($date2-$date1))
inusetime="$(($diff / 60)) minutes"
else
inusetime="-"
fi
if [[ $VRDEClientIP ]]; then
phone=`echo $VRDEClientIP | cut -d"." -f 4`
else
phone="-"
fi
pid=`ps aux | grep "$line --startvm" | grep -v grep | awk '{print $2}'`
if [[ $pid ]]; then
load=`top -p $pid -b -n 1 | tail -1 | awk '{print $9}'`
tmpmem=`top -p $pid -b -n 1 | tail -1 | awk '{print $10}'`
usedmem=`echo "scale=0; 16465144 / 100 * $tmpmem / 1024" | bc`
else
pid="-"
load="-"
usedmem="-"
vrdeport="-"
fi
printf "%-25s %-15s %5s %5s %5s %10s %5s %10s%% %-10s %-15s %-5s %-15s %-5s %-15s %s\n" "$name" "$ostype" "$memory" "$cpus" "$vram" "$usedmem" "$pid" "$load" "$VMState" "$VideoMode" "$vrdeport" "$inusetime" "$phone" "$clipboard" "$UUID"
name=""
ostype=""
UUID=""
memory=""
cpus=""
vram=""
VMState=""
VMStateChangeTime=""
VideoMode=""
vrdeport=""
VRDEStartTime=""
VRDEClientIP=""
clipboard=""
done
echo ""
Das Script gibt Informationen zu laufenden Virtuellen Maschinen (VirtualBox) aus und stellt diese übersichtlich dar:
root@vm ~$ ./vminfo.sh
Name Typ Mem CPUs VRAM Used Mem PID CPU Load% State Video Port Session User Clipboard Multi UUID
Debian Test Debian (64 bit) 1024 1 12 - - -% poweroff - - - bidirectional on cde3fe42-c5d6-431a-9683-30a61934f97a
Win7 - IE10 (64bit) Windows 7 (64 bit) 768 1 16 820 6277 6.6% running 1920,1200,32 3604 - - bidirectional off 7478a7a8-ee3d-4028-8ab8-229fe57b7473
Win7 - IE9 (64bit) Windows 7 (64 bit) 768 1 16 836 4908 0.0% running 1024,768,32 3995 - - bidirectional off 8ff5d279-4d39-4256-a0e5-b5f0d4a3bb91
Win8 - IE10 (64bit) Windows 8 (64 bit) 1024 1 24 1077 6148 0.0% running 1024,768,32 3993 - - bidirectional off a4eee3f1-1691-4c4e-9ae8-f54fe95d2891
Das Script führt als Benutzer vbox
den Befehl vboxmanage list vms
auf:
"Debian Test" {cde3fe42-c5d6-431a-9683-30a61934f97a}
"Win7 - IE9 (64bit)" {0a0cfff2-d4af-4eb2-8ae1-8d212e3d450d}
"Win7 - IE10 (64bit)" {7478a7a8-ee3d-4028-8ab8-229fe57b7473}
"Win8 - IE10 (64bit)" {a4eee3f1-1691-4c4e-9ae8-f54fe95d2891}
Der Zusatz | cut -d\" -f2 | sort
sorgt für folgende Ausgabe:
Debian Test
Win7 - IE9 (64bit)
Win7 - IE10 (64bit)
Win8 - IE10 (64bit)
Diese Zeilen werden dann durch while read
als line
weiterverarbeitet. Unter anderen wird der Befehl su vbox --shell=/bin/bash --command "vboxmanage showvminfo '$line' --machinereadable" | grep '^[A-Za-z0-9_]*=' > /tmp/machine.txt
ausgeführt. Er schreibt alle Informationen über eine virtuelle Maschine in die Datei /tmp/machine.txt
und liest diese dann zur Verwendung im Script ein.
Diese Informationen werden geprüft und mit weiteren Daten angereichert. Am Ende werden Sie mit printf
ausgegeben. Die Zeile
printf "%-25s %-15s %5s %5s %5s %10s %5s %10s%% %-10s %-15s %-5s %-15s %-5s %-15s %s\n"
"$name" "$ostype" "$memory" "$cpus" "$vram" "$usedmem" "$pid" "$load" "$VMState"
"$VideoMode" "$vrdeport" "$inusetime" "$phone" "$clipboard" "$UUID"
bestimmt dabei Inhalt und Format. Zu Beginn werden die Spaltenbreiten definiert. %-25s
bedeutet dass hier ein String (s
) verarbeitet wird der linksbündig (-
) angeordnet ist und 25 Zeichen lang sein darf (25
). Das \n
erzeugt einen Zeilenumbruch. Die Variablen am Ende enthalten die Werte für die VM aus der Datei /tmp/machine.txt
.