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
Zusammenrechnen
Re: Zusammenrechnen
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
<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
Re: Zusammenrechnen
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
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
Re: Zusammenrechnen
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?
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
Riedel -> www.riedelweb.de
Re: Zusammenrechnen
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.
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.
Re: Zusammenrechnen
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!
Viel Spass dabei!