Archiv verlassen und diese Seite im Standarddesign anzeigen : wie bestimmte Werte nach Leerzeichen auslesen
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
tu jede zeile einfach mit
@a = split(/ +/,$b);
trennen, dann haste alles in einer liste, und kannst es weiterbearbeiten ...
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)
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
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.
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 ;-)
<pre>
cat /proc/net/dev | grep eth0 | sed 's/:/ /' | awk '{print $2, $3, $10, $11}'
</pre>
Thomas
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]}
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.