Optimale Definition von Potenzen im bc (Umrechnung Bytes)

R

Ritter

Grünschnabel
Das folgende Script zieht per SNMP accounting Daten vom Router und stellt diese leicht aufbereitet dar. Nun ist der GNU bc mehr als nur ein Rechner, genaugenommen eine Programmiersprache für arithmetische Berechnungen und sollte daher auch mit Potenzen umgehen können. Google'n hat nicht geholfen; ich finde kein Beispiel wie das praktisch aussehen könnte und wollte daher Fragen, ob da jemand eine Idee hat.


#! /bin/bash
case $1 in
d|D ) IFACE=24 ;;
v|V ) IFACE=28 ;;
esac

printf "\n"
IFNAME=`snmpget -v2c -c public 192.168.0.1 IF-MIB::ifDescr.${IFACE} | awk '{printf $4}'`
TRAFFIC=`snmpget -v2c -c public 192.168.0.1 IF-MIB::ifInOctets.${IFACE} | awk '{printf $4}'`
printf "Interface:\t $IFNAME\n"
printf "Bytes:\t\t $TRAFFIC"
Traffic_KByte=$(echo -e "scale=2 ;\n$TRAFFIC/1024 \nquit" | bc -l)
printf "\nKBytes:\t\t $Traffic_KByte"
Traffic_MByte=$(echo -e "scale=2 ;\n$TRAFFIC/1024/1024 \nquit" | bc -l)
printf "\nMBytes:\t\t $Traffic_MByte"
Traffic_GByte=$(echo -e "scale=2 ;\n$TRAFFIC/1024/1024/1024 \nquit" | bc -l)
printf "\nGBytes:\t\t $Traffic_GByte"
printf "\n\n"


Wenn ich nicht ganz falsch liege, sollte statt '1024/1024' auch 2^1024 beziehungsweise statt '1024/1024/1024' auch 3^1024 funktionieren? Wenn ich das aber probiere, erhalte ich als Rückgabe lediglich 0. Oder habe ich einen Denkfehler hinsichtlich Potenzen?
 
Ich habe zwar keine Ahnung von Scriptsprachen, aber bist du sicher, dass es 1024/1024 heißen muss und nicht 1024*1024 wenn du mit Potenzen arbeiten willst? 1024*1024 ist auch 1024^2 und nicht 2^1024. Daran kann es auch liegen, dass du 0 erhälst, da 1024^2 << 2^1024.
Würde ich so sagen mit meinen Kentnissen aus C/C++ und Mathe.
 
Hi!

Da war doch was mit der Reihenfolge von Punkt- und Strichrechnungen usw :)
Code:
> echo "123456789/1024/1024"|bc
117
> echo "123456789/(1024/1024)"|bc
123456789
> echo "123456789/(1024*1024)"|bc
117
> echo "123456789/(1024^2)"|bc   
117
 
Hallo
thobit hat Recht.
Das kannst du leicht überprüfen, indem du die beiden Ausgaben von
1024 * 1024 und 1024 ^ 2 vergleichst.
Und 2 ^ 1024 entspricht 2 in der 1024 Potenz!
wolle@Nietzsche:~
$ echo "2 ^ 1024"|bc
17976931348623159077293051907890247336179769789423065727343008115773\
26758055009631327084773224075360211201138798713933576587897688144166\
22492847430639474124377767893424865485276302219601246094119453082952\
08500576883815068234246288147391311054082723716335051068458629823994\
7245938479716304835356329624224137216


Wenn du aber von Byte ausgehend auf kb mb und gb umrechnen willst, musst du natürlich durch 1000 hoch n teilen, was das gleiche ist wie n * durch 1000.
Das ist reine Mathematik. ;)
A/B^n = A/B*B*B = ((A/B)/B)/B
Die 1024 für 1000 kannst du auch verwenden, jedoch ist das streitbar.
Das ist aber eine andere Baustelle.


Gruß Wolfgang
 
Noch ergänzend: 1024*1024 = 2^20 und nicht 2^1024.
 

Ähnliche Themen

Shellskript - Fehler in Cron

Queue für copy Script

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Variableninhalt wird nicht gespeichert

Prozess aus eigenem Init script wird gekillt

Zurück
Oben