String parsen

String parsen

am 15.10.2006 11:48:02 von vicodas

Hallo,

ich versuche ein aus dem mrtg Paket stammendes Script anzupassen.
Dieses soll die Ausgabe des Befehl
/usr/bin/sar -u 1 10 | grep Durchschn.
z.B.:
Durchschn.: all 0,20 0,00 0,40 0,00 0,00
99,40
parsen.
Kann mir einmal jemand folgenden Code erklären:
$getcpu =~
/^Durch\s+all\s+(\d+)\.\d+\s+\d+\.\d+\s+(\d+)\.\d+\s+\d+\.\d +/;
$getcpuusr = $1;
$getcpusys = $2;

Die Variablen $getcpuusr und $getscpusys sind immer leer ?


thx vicodas

Re: String parsen

am 15.10.2006 11:57:59 von Thomas Wittek

Karsten Schöke schrieb:
> ich versuche ein aus dem mrtg Paket stammendes Script anzupassen.
> Dieses soll die Ausgabe des Befehl
> /usr/bin/sar -u 1 10 | grep Durchschn.
> z.B.:
> Durchschn.: all 0,20 0,00 0,40 0,00 0,00=
=20
> 99,40
> parsen.
> Kann mir einmal jemand folgenden Code erklären:
> $getcpu =3D~ /^Durch\s+all\s+(\d+)\.\d+\s+\d+\.\d+\s+(\d+)\.\d+\s+\d+\=
\d+/;
> $getcpuusr =3D $1;
> $getcpusys =3D $2;
>=20
> Die Variablen $getcpuusr und $getscpusys sind immer leer ?

Der Reguläre Ausdruck parst auf Punkte "." (bzw. \. in der RegExp).
Deine Ausgabe hat aber Kommas "," als Dezimaltrennzeichen.
Ersetze alle "\." durch "," in der RegExp und die Variablen sollten
nicht mehr leer sein.

Allerdings nutzt Perl intern den Punkt als Trennzeichen. Die Werte mit
Kommas werden also als Strings und nicht als Dezimalzahlen erkannt.
Vielleicht willst du also einfach vor

$getcpu =3D~ ...

eine Zeile

s/,/./g;

setzen, die alle Kommas durch Punkte ersetzt. Dann kann die zweite Zeile
unverändert bleiben.

--=20
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur@jabber.i-pobox.net

Re: String parsen

am 15.10.2006 12:04:56 von Christian Garbs

Mahlzeit!

Thomas Wittek wrote:
> Karsten Schöke schrieb:

>> Durchschn.: all 0,20 0,00 0,40 0,00 0,00
>> 99,40

>> Kann mir einmal jemand folgenden Code erklären:
>> $getcpu =~ /^Durch\s+all\s+(\d+)\.\d+\s+\d+\.\d+\s+(\d+)\.\d+\s+\d+\.\d +/;

> Vielleicht willst du also einfach vor
>
> $getcpu =~ ...
>
> eine Zeile
>
> s/,/./g;
>
> setzen, die alle Kommas durch Punkte ersetzt. Dann kann die zweite Zeile
> unverändert bleiben.

Fast. Der Suchbegriff beginnt mit "^Durch\s", der Text mit "Durchschn.:".

Je nachdem, was an anderen Zeilen in der Ausgabe vorkommt, könnte der
Suchausdruck am Anfang z.B. zu "/^Durch.+all" umgeändert werden.

Gruß,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_

Re: String parsen

am 15.10.2006 12:24:09 von Thomas Wittek

Christian Garbs schrieb:
>> Karsten Schöke schrieb:
>>> Durchschn.: all 0,20 0,00 0,40 0,00 0,=
00=20
>>> [...]
>>> $getcpu =3D~ /^Durch\s+all\s+(\d+)\.\d+\s+\d+\.\d+\s+(\d+)\.\d+\s+\d=
+\.\d+/;
> Fast. Der Suchbegriff beginnt mit "^Durch\s", der Text mit "Durchschn.=
:".

Ups, das hatte ich übersehen ;).

Das hier könnte in deinem Fall funktionieren (dann bekommst du auch =
die
komplette Zahl und nicht nur den Wert vor dem Komma):

s/,/./g;
$getcpu =3D~
/^Durchsch.:\s+all\s+(\d+\.\d+)\s+\d+\.\d+\s+(\d+\.\d+)\s+\d +\.\d+/;
$getcpuusr =3D $1;
$getcpusys =3D $2;

--=20
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur@jabber.i-pobox.net

Re: String parsen

am 15.10.2006 19:09:13 von vicodas

Hi @all,

Danke für die Tips, werde die sache jetzt bestimmt hinbekommen!


thx vicodas