Zusammenrechnen

Post Reply
Message
Author
riedel1
Posts: 2
Joined: 16. Aug 1999 19:35
Location: BS
Contact:

Zusammenrechnen

#1 Post by riedel1 »

Hallo alle miteinander,
erstmal: ich habe NULL Plan vom Programmieren, deshalb auch hier meine Frage:

Ich lasse mir unter Linux eine Datei ausgeben die so aussieht:

eth0 dev 41859020
ippp0 dev 38338681
192.168.33.10 out 35640482
192.168.33.10 in 5227561
192.168.33.20 out 3597970
192.168.33.20 in 34256471

Ich möchte jetzt gerne das ich die in/out der IP's zusammen rechnen lasse (für jede ip extra) und mir der Wert in eine neue Datei geschrieben wird, also so ungefähr:

192.168.33.10 gesammt 40868043
Das ergebnis soll dann ich eine neue Datei geschrieben werden.

Für 192.168.33.20 soll genau das selbe gemacht werden und dann auch in eine neue Datei geschrieben werden.

Ist das möglich? Wenn ja, wie kann sowas auch ein nicht Programmierer hinbekommen?

DANKE

riedel

Jochen

Re: Zusammenrechnen

#2 Post by Jochen »

Hmm, sowas macht man eigentlich nicht mit C, wenn man nicht unbedingt (aus Performance-Gründen oder so) muss. Ein Skript wäre einfacher. Das folgende funktioniert zusammen mit Deinen Testdaten, sollte es also tun:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
$2 == "in" || $2 == "out" {
ip[$1] += $3
}
END {
for ( ix in ip ) {
print ix " gesamt " ip[ix]
}
}
</font><hr></pre></blockquote>
Pack den Source in eine Datei namens "ipadd", Aufruf ist dann<pre>awk -f ipadd datei-mit-deinen-daten > auswertung </pre>
Sach Bescheid, falls ich Dich missverstanden habe und es das nicht so tut.

Ach ja: Ich weiss, awk-Skripte sind heutzutage nicht mehr modern. Aber perl kann ich (noch) nicht.

Grüsse, Jochen

riedel

Re: Zusammenrechnen

#3 Post by riedel »

Hi,

sorry, aber sollte gar nicht ion c geschrieben werden. Bin nur ins falsche Forum gelandet <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">

Werde dein Script mal antesten.

Danke

riedel1
Posts: 2
Joined: 16. Aug 1999 19:35
Location: BS
Contact:

Re: Zusammenrechnen

#4 Post by riedel1 »

Hallo Jochen,

danke für das Programm, es funktioniert.
Aber könntes du mir das Programm erklären, also was es wann macht?
Wäre supernett!

Nochwas, wie kann ich jetzt die Ausgabe anstatt in Kilobytes in Megabyte anzeigen lassen?
bye
Riedel -> www.riedelweb.de

Jochen

Re: Zusammenrechnen

#5 Post by Jochen »

Das habe ich befürchtet <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">!

Nun gut. Als erstes musst Du wissen, dass der awk eine ganze Masse schon für uns erledigt. Er
<li>öffnet und schliesst Dateien,
<li>liest jede Zeile einzeln,
<li>zerlegt sie in Felder (1. Feld = $1, 2. Feld = $2, ...).
awk-Programme bestehen aus Folgen von Bedingungen und Aktionen. Ist die Bedingung erfüllt, wird die dazugehörige Aktion ausgeführt.

Die erste Bedingung lautet '$2 == "in" || $2 == "out"'. $2 ist das zweite Feld,´also die Stelle, wo in Deinen Daten dev, in oder out vorkommt. Auswerten wollen wir aber nur die Zeilen mit "in" bzw. "out". '$2 == "in"' ist die Abfrage, ob dort "in" steht, dazu analog "out". Die beiden Bedingungen werden Oder-verknüpft (||), d.h, es reicht, wenn entweder das eine oder das andere zutrifft (oder beides). Haben wir also so eine Zeile, wird die Aktion (in den geschweiften Klammern) ausgeführt. Ohne jetzt auf assoziative Arrays näher eingehen zu wollen: Hier wird eine Summe des dritten Feldes einer Zeile (die KBs) zugehörig zur IP-Adresse geführt, die im ersten Feld steckt.

Die END-Bedingung greift, wenn alle Zeilen gelesen wurden, also keine weiteren Zeilen mehr kommen. Dort wird in einer Schleife über alle aufgetretenen IP-Adressen (for ix in ip) erst die IP-Adresse selbst und dann die Summe an KBs zur IP-Adresse ausgegeben (print ix " gesamt " ip[ix]).

Hier kannst Du ansetzen, wenn Du lieber MBs haben willst: Anstelle von "ip[ix]" schreibst Du "int(ip[ix]/1024+0.5)". Damit erhältst Du die MBs, gerundet auf volle MBs.

Jochen

Re: Zusammenrechnen

#6 Post by Jochen »

Ach ja, falls Dich awk weiterhin interessiert (oder Du einfach noch mehr Infos brauchst): Einfach "info gawk" eingeben bzw. in der KDE-Help (so Du KDE verwendest) die Info-Seiten nach gawk durchsuchen. Nette Einführung, viele Beispiele, Einzeiler, Referenz usw.

Viel Spass dabei!

Post Reply