String parsen

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
vicodas [ So, 15 Oktober 2006 11:48 ] [ ID #1501064 ]

Re: String parsen

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=

> 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+\=
=2E\d+/;
> $getcpuusr =3D $1;
> $getcpusys =3D $2;
>
> 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.

--
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur [at] jabber.i-pobox.net
Thomas Wittek [ So, 15 Oktober 2006 11:57 ] [ ID #1501065 ]

Re: String parsen

Mahlzeit!

Thomas Wittek <mail [at] gedankenkonstrukt.de> 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:<mitch [at] cgarbs.de>',y;:;\t;;print;_;_
Christian Garbs [ So, 15 Oktober 2006 12:04 ] [ ID #1501066 ]

Re: String parsen

Christian Garbs schrieb:
>> Karsten Sch=C3=B6ke schrieb:
>>> Durchschn.: all 0,20 0,00 0,40 0,00 0,=
00
>>> [...]
>>> $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 =C3=BCbersehen ;).

Das hier k=C3=B6nnte 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;

--
Thomas Wittek
http://gedankenkonstrukt.de/
Jabber: streawkceur [at] jabber.i-pobox.net
Thomas Wittek [ So, 15 Oktober 2006 12:24 ] [ ID #1501067 ]

Re: String parsen

Hi [at] all,

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


thx vicodas
vicodas [ So, 15 Oktober 2006 19:09 ] [ ID #1501070 ]
Perl » de.comp.lang.perl.misc » String parsen

Vorheriges Thema: Lexikalische Variable
Nächstes Thema: WWW::Mechanize