PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: komische summierung



querus
06-10-2002, 01:24
hallo, ich habe ein kleines problem mit einem script, das ich mir basteln wollte:

script:

/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $6}' | gawk -F':' '{print $2}' >> updown
/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $2}' | gawk -F':' '{print $2}' >> updown
sum=0; for i in `cat updown`; do ((sum+=i));done; echo $sum

wenn ich dieses script öfters ausführe, wird aus der summe der werte (alles positive werte) plötzlich eine negative zahl.


164377428
340828451
164377488
340828573
164377488
340828573
164377548
340828635
164377643
340828762
164377769
340829127
164515976
341218142

habt ihr vielleicht eine idee, woran das liegen bzw. wie ich diesen fehler ausbessern könnte?

danke im voraus für eure hilfe

Hans-Georg Normann
06-10-2002, 09:05
Hi querus,

warum nimmst du nicht cat /proc/net/dev ? Dann könntest du sogar ohne awk auskommen.

Dass die Zahlen auf einmal negativ erscheinen kann vielleicht damit erklären, dass deine shell mit vorzeichenbehafteten Integerwerten rechnet, während im ifconfig mit vorzeichenlosen Integer oder gar mit Longinteger gearbeitet wird. Bei vorzeichenbehafteten Integerwerten gibt das höchstertige Bit das Vorzeichen an, d. h. wenn die Zahl so groß wird, daß das höchste Bit gesetzt, erscheint sie auf einmal negativ.

Frag mich bitte nicht, wie man das in der shell ändern kann.

Hans

querus
06-10-2002, 09:52
danke für die antwort. ich habe das script jetzt auf /proc/net/dev angepaßt - allerdings mit dem gleichen ergebnis. der wert wird bei zu vielen daten negativ :(


cat /proc/net/dev | grep eth0 | gawk '{print $2}' >> updown
cat /proc/net/dev | grep eth0 | gawk '{print $10}' >> updown
sum=0; for i in `cat updown`; do ((sum+=i));done; sum=$[$sum/1048576]

Hans-Georg Normann
06-10-2002, 15:24
Warum grep, wenn du schon awk einsetzt. versuchs mal so:


cat /proc/net/dev | gawk '/eth0/ {printf("%d\n%d\n", $2, $10)}' >> updown
sum=0; for i in `cat updown`; do ((sum+=i));done; sum=$[$sum/1048576]
awk sucht nach einem Muster (eth0) und wendet auf jede gefundene Zeile das kommando {...} an.

Das Prob mit dem Überlauf haben wir dadurch natürlich nicht gelöst. Da du ja bereits den awk einsetzt, warum lässt du ihn nicht ein bisschen mehr machen, außer ein print / printf. Im Gegensatz zur Shell kann der awk auch mit Floatingpoint Variablen umgehen. Der kann ganz schön rechnen.

Wenn dir das nicht gefällt, wie wäre es mit bc? Das ist schließlich für knifflige Kalkulationen geschrieben. Ich glaube das kann auch ganz große Zahlen. Bei meinem SuSE 7.3 ist das drauf. Ich glaube das ist Standard. Sieh dir das mal mit man bc an.

Hans

querus
06-10-2002, 17:42
okay, ich werde einfach den wert, den ich aus "cat /proc/net/dev | grep eth0 | gawk '{print $2}' " erhalte einer variable übergeben, die ich dann mal vorsorglich durchdividiere. somit stehen in der textdatei, die von der bash summiert wird, kleinere werte drinnen - und es dürfte keinen überlauf mehr geben :)

danke nochmals für deine hilfe