Inhalt einer Datei einer Variablen zuweisen und damit rechnen
Hallo Liste! Ich würde gerne den Inhalt einer Datei einer Variablen zuweisen (Zahlenwert) und dann damit rechnen. Etwa in der Form $erster_wert=cat wert1.txt $zweiter_wert=cat wert2.txt $ergebnis=$erster-$zweiter echo "$ergebnis" Kann mir jemand sagen, wie das in der bash geht? Danke! Jens
Am Die, 11 Dez 2001 schrieb Jens Wolfgarten:
Ich würde gerne den Inhalt einer Datei einer Variablen zuweisen (Zahlenwert) und dann damit rechnen. Etwa in der Form
$erster_wert=cat wert1.txt $zweiter_wert=cat wert2.txt $ergebnis=$erster-$zweiter echo "$ergebnis"
erster_wert=`cat wert1.txt` zweiter_wert=`cat wert2.txt` ergebnis=$(($erster_wert-$zweiter_wert)) echo $ergebnis Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Hi Jens, On 11 Dec 2001 at 11:06, Jens Wolfgarten wrote:
Ich würde gerne den Inhalt einer Datei einer Variablen zuweisen (Zahlenwert) und dann damit rechnen. Etwa in der Form
$erster_wert=cat wert1.txt $zweiter_wert=cat wert2.txt $ergebnis=$erster-$zweiter echo "$ergebnis"
--- snip --- #!/bin/bash cd /tmp erster_wert=`cat w1` zweiter_wert=`cat w2` ergebnis=`expr $erster_wert - $zweiter_wert` echo $ergebnis --- snap ---
Hallo Liste! Hier mal das Skript, dann sieht man besser, was ich machen will... #!/bin/bash DIRECTORY=/var/log/traffic cd $DIRECTORY ifconfig > ifconfig.txt tx_last=`cat tx_last.txt` rx_last=`cat rx_last.txt` mv tx.txt tx_last.txt mv rx.txt rx_last.txt cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $3,$4}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > tx.txt cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $7,$8}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > rx.txt tx=`cat tx.txt` echo "$tx" rx=`cat rx.txt` echo "$rx" rx_gesamt=`expr $rx - $rx_last` tx_gesamt=`expr $tx - $tx_last` gesamt=`expr $rx_gesamt + $tx_gesamt` echo "$gesamt" Ich hoffe, ihr könnt mir helfen, so funktioniert es leider nicht. Danke Jens
Am Die, 11 Dez 2001 schrieb Jens Wolfgarten:
Hier mal das Skript, dann sieht man besser, was ich machen will... [...] cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $3,$4}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > tx.txt
cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $7,$8}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > rx.txt
Irgendwie scheinst Du ein anderes ifconfig zu haben als ich, bei mir gibt es z.B. nur RX packets etc. Aber wenn ich das richtig verstehe, willst Du eine bestimmte Zeile in der Ausgabe von ifconfig parsen und den Wert für RX bzw. TX Bytes mit dem vom letzten Aufruf (gespeichert in tx_last.txt) vergleichen. Ich würde Dir dazu perl empfehlen, auf jeden Fall einfacher als diese Kombination von grep, sed und awk. Das kann perl auch alles und zwar viel schöner. Wenn Du mir mal die genaue Ausgabe schickst, die Du parsen willst inkl. einer exakten Beschreibung, was Du haben willst, kann ich Dir da auch gerne behilflich sein.
rx_gesamt=`expr $rx - $rx_last` rx_gesamt=$(($rx - $rx_last)) klappt bei mir.
Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
On Tue, 11 Dec 2001, Jens Wolfgarten wrote:
Hier mal das Skript, dann sieht man besser, was ich machen will...
ifconfig > ifconfig.txt [..] cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $3,$4}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > tx.txt
cat ifconfig.txt | grep -A 8 eth1 | grep 'RX bytes' | awk '{print $7,$8}' | sed -n -e "s/(//p" | sed -n -e "s/)//p" | sed -n -e "s/Mb//p" | sed -n -e "s/ //p" > rx.txt
URGS. Erstmal: dein ifconfig scheint ein anderes zu sein. Verrate mal welches OS,Distri und ifconfig du verwendest und wie die Ausgabe von ifconfig aussieht. Ansonsten kannst obiges gewurschtel auch mit einem einzigen sed machen, vorausgesetzt, du rufst ifconfig mit dem Device als Parameter auf. Bei 'meinem' ifconfig sieht die Ausgaben dann so aus: $ ifconfig ppp0 | tee /tmp/ifconfig.ppp0 ppp0 Link encap:Point-to-Point Protocol inet addr:62.224.98.72 P-t-P:193.158.145.109 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1524 Metric:1 RX packets:2554 errors:0 dropped:0 overruns:0 frame:0 TX packets:2704 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 $ sed -n '/RX[^:]*:/s/.*RX[^:]*:\([^ ]*\).*/\1/p' < /tmp/ifconfig.ppp0 2554 $ sed -n '/TX[^:]*:/s/.*TX[^:]*:\([^ ]*\).*/\1/p' < /tmp/ifconfig.ppp0 2704 Das Ergebnis kann man dann ja ggfs. mittels der MTU in Byte umrechnen. Ich wuerde ausserdem mit Variablen arbeiten: RX=`sed ... ` TX=`sed ... ` MTU=`sed ...`; RX=$[ $RX * $MTU ]; echo $RX > rx.txt TX=$[ $TX * $MTU ]; echo $TX > tx.txt RX_DIFF=$[ $RX - $LAST_RX ] TX_DIFF=$[ $TX - $LAST_TX ] Oder so.... Ach ja $[] ist eine alternative Schreibweise von $(( )). Wenn du also mal mehr info's liefern wuerdest... Dann sind bis evtl. auf das erste grep alle weiteren Befehle durch ein sed ersetzbar. -dnh -- Anything that happens, happens. --- Anything that, in happening, causes something else to happen, causes something else to happen. --- Anything that, in happening, causes itself to happen again, happens again. --- It doesn't necessarily do it in chronological order, though. --- Douglas Adams
Am Dienstag, 11. Dezember 2001 12.34 schrieb Jens Wolfgarten:
rx_gesamt=`expr $rx - $rx_last` tx_gesamt=`x_gesamt=`eexpr $tx - $tx_last` gesamt=`expr $rx_gesamt + $tx_gesamt` echo "$gesamt"
Hallo Jens, das expr, wie auch die Variante mit $((...)) oder $[...] koennen mit Nachkommastellen nicht umgehen. Entweder rechnest du die Werte in Bytes um, oder du verwendest dc "an arbitrary precision calculator" (man dc). dc Verwendet die RPN Notation (schwaerm). rx_gesamt=`dc -e "$rx $rx_last - p"` tx_gesamt=`dc -e "$tx $tx_last - p"` gesamt=`dc -e "$rx_gesamt $tx_gesamt + p"` -- Viele Grüsse Urs Schaffner
* Jens Wolfgarten schrieb am 11.Dez.2001:
Ich würde gerne den Inhalt einer Datei einer Variablen zuweisen (Zahlenwert) und dann damit rechnen. Etwa in der Form
$erster_wert=cat wert1.txt $zweiter_wert=cat wert2.txt $ergebnis=$erster-$zweiter echo "$ergebnis"
Kann mir jemand sagen, wie das in der bash geht?
Bourneshell allgemein: ---(schnipp)------------------------------------------------------ #!/bin/sh ERSTER_WERT=`cat wert1.txt` ZWEITER_WERT=`cat wert2.txt` ERGEBNIS=`expr $ERSTER_WERT - $ZWEITER_WERT` echo $ERGEBNIS ---(schnapp)------------------------------------------------------ Mit der bash geht es auch einfacher, ist aber nicht kompatibel: ---(schnipp)------------------------------------------------------ #!/bin/bash ERSTER_WERT=$(cat wert1.txt) ZWEITER_WERT=$(cat wert2.txt) ERGEBNIS=$(($ERSTER_WERT - $ZWEITER_WERT)) echo $ERGEBNIS ---(schnapp)------------------------------------------------------ Wenn man die Zwichenwerte nicht braucht, geht es auch in einer Zeile: ---(schnipp)------------------------------------------------------ #!/bin/bash echo $(( $(cat wert1.txt) - $(cat wert2.txt) )) ---(schnapp)------------------------------------------------------ kann man auch für die Bourne-Shell allgemein machen, aber dann wird es haarig: ---(schnipp)------------------------------------------------------ #!/bin/sh echo `expr \`cat wert1.txt\` - \`cat wert2.txt\`` ---(schnapp)------------------------------------------------------ Und wenn da nicht - sondern * stände, so müßte man den natürlich auch noch maskieren. Bernd -- ROTFL = Rolling On The Floor, Laughing = Auf dem Boden wälzen, lachend. SCNR = Sorry, Could Not Resist = Sorry, Ich konte nicht wiederstehen. AFAIK = As Far As I Know = So weit ich weis|BTW = By The Way = Nebenbei bemerkt IMHO = In My Humble Opinion = meiner bescheidenen Meinung nach |Zufallssig. 9
participants (6)
-
B.Brodesser@t-online.de
-
Christoph Maurer
-
David Haller
-
Jens Wolfgarten
-
Jörg Zimmermann
-
Urs Schaffner