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