bash: Daten ausgeben mit printf

imported

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.


Kommentare

Kommentare unterstützt von Disqus.

Nächster Beitrag Vorheriger Beitrag