PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie bestimmte Werte nach Leerzeichen auslesen



25-03-2001, 17:59
Moin,
wie kann in einem Shellscript Werte aus einer Datei auslesen, die durch Leerzeichen (bzw. Tabulatorzeichen) getrennt sind und variable Längen haben? Ich möchte eine Auswertung des Netzwerkverkehrs über bestimmte Netzwerkkarten machen (glaube dem ISP mit seinen Angaben nicht ;-)). Dabei will ich in der Datei /proc/net/dev die Rx- und Tx-Werte zur weiteren Verarbeitung auslesen lassen. Zeilenweise hilft mir grep aber "spaltenweise" ?

Besten Dank!
Marcus

25-03-2001, 18:14
tu jede zeile einfach mit
@a = split(/ +/,$b);
trennen, dann haste alles in einer liste, und kannst es weiterbearbeiten ...

25-03-2001, 19:47
Mein Vorposter hat natuerlich recht, aber das ist ja Perl und kein Shellskript ;-)
Mit bash ging es z.B. so:


cat /proc/net/dev | grep eth0 | (read X RBYTES RPACKETS X X X X X X TBYTES TPACKETS X X X X X; echo $RBYTES $RPACKETS $TBYTES $TPACKETS)

25-03-2001, 20:52
Super! Das ist was ich gesucht habe!

Aber ich habe das Problem, wenn ich die Variablen wie $RBYTES usw. nicht sofort (innerhalb der Klammer) ausgeben oder verarbeiten lassen will, dass diese leer sind. - Warum? (Bin blutiger Anfänger :-))

Danke

Marcus

25-03-2001, 22:03
Jeder Teil der Pipe lauft als eigener Prozess.
Deshalb lauft das Read in einer Subshell.
Die Klammern nehmen echo mit in diese subshell. Die Aufrufende shell kennt leider nicht die Variablen der Subshell.

Du solltest aber ohne Probleme in den Klammerm einfach weitermachen koennen.

Alternativ sollte folgendes gehen:

declare -a VARS
VARS=(`cat /proc/net/dev | grep eth0`)
RBYTES=${VARS[1]}
RPACKETS=${VARS[2]}
TBYTES=${VARS[9]}
TPACKETS=${VARS[10]}

Oder natuelich Perl / Python nehmen, wie ja schon weiter oben erwaehnt.

27-03-2001, 13:12
Neuer Vorschlag

declare -a VARS
ZEILE=`cat /proc/net/dev | grep eth0 `
VARS=(${ZEILE/eth0:/})
RBYTES=${VARS[0]}
RPACKETS=${VARS[1]}
TBYTES=${VARS[8]}
TPACKETS=${VARS[9]}


Anmerkungen:
grep wichtig, um die richtige zeile zu kriegen
VARS=(...), runde Klammern entschiedend fuer Arrayzuweisung

Ich hoffe so klappt`s ;-)

thommy
27-03-2001, 13:20
<pre>
cat /proc/net/dev | grep eth0 | sed 's/:/ /' | awk '{print $2, $3, $10, $11}'
</pre>

Thomas

28-03-2001, 00:37
Hallo jgbauman,
die Methode klappt leider nur eine Zeit lang:
Sobald der Zähler für empfangene Bytes (RBYTES) eine gewisse Länge erreicht, stößt dieser mit eth0: zusammen. Dann ändern sich leider leider die angegenene Position der auszulesenden Werte in VARS.
Ich habe dann versucht dann mittels

ZEILE=`cat /proc/net/dev`
declare -a VARS
VARS=${ZEILE#eth0:}

versucht über den Zwischenschritt mit der Variable ZEILE das Muster eth0: herauszufiltern, um nur noch numerische Werte zu bekommen.
Das Problem liegt in VARS=${ZEILE#eth0:}.
Als Rückgabewert (echo $VARS) bekomme ich den Inhalt von Zeile, d.h. mit eth0: am Anfang.
Warum ? Welche andere Methode wäre vielleicht sinnvoller ?

Thnx Marcus

Um nicht schreiben zu müssen

RBYTES=${VARS[0]}RPACKETS=${VARS[2]}TBYTES=${VARS[9]}TPACKETS=${VARS[10]}