Hallo zusammen,
ich versuche, den FHEM-Server über Sysmon zu überwachen. Das klappt soweit, nur die vordefinierten Plots funktionieren nicht, da ich statt FileLog alles ins DBLog schreibe.
Ich habe nun versucht, die Plots anzupassen, aber beim Plot SM_CPUStat komme ich schon nicht weiter. Die dort vorgegebenen Werte (z. B. Systemmonitor:stat_cpu_percent:0:$fld[5]: ) funktionieren nicht, und ich habe im Wiki gelesen, dass ich stattdessen über Regex gehen muss. Der Inhalt für "stat_cpu_percent" ist in der DB wie folgt hinterlegt: "0.69 0.00 0.29 98.69 0.33 0.00 0.00". Wie kann ich mir da nacheinander die sieben Werte einzeln extrahieren?
Das Beispiel aus dem Wiki funktioniert leider nicht. Kann mir jemand helfen?
Vielen Dank im Voraus.
Gruß Daniel
Vielen Dank für dioe Hilfe?
Hallo Daniel,
konkretes Beispiel um den ersten Wert auszuwerten:
#LogDBShort sysmon:stat_cpu_percent:::$val=~s/([\d.]*).[\d.]*.[\d.]*/$1/eg
Wichtig ist die rot hervorgehobene Klammer. Der erste Wert in der Klammer (hier $1) wird als Substitut verwendet und zurück gegeben. Würdest du den zweiten Wert wollen, wäre der Ausdruck z.B.:
#LogDBShort sysmon:stat_cpu_percent:::$val=~s/[\d.]*\s([\d.]*).*/$1/eg
Und so weiter ...
Es macht sich gut wenn man seine Regex in einem Regex-Tester durchspielt, z.B. den https://regex101.com/.
Grüße,
Heiko
Hallo Heiko,
vielen Dank für den Tipp und die Beispiele, das hat super funktioniert!! 8)
Ich habe noch eine Frage zum Aufsummieren mit Regex: einige der Plots arbeiten mit Summen, wie z. B. SM_CPUStatSum.gplot. Dort steht im Original z. B.
#FileLog 6:stat_cpu_percent:0:$fld[3]+$fld[4]+$fld[5]
Ich habe für die ersten drei Felder folgende Regex als Match definiert:
#DBLogging sysmon:stat_cpu_percent:::$val=~s/([\d.]*).*/$1/eg
#DBLogging sysmon:stat_cpu_percent:::$val=~s/[\d.]*\s([\d.]*).*/$1/eg
#DBLogging sysmon:stat_cpu_percent:::$val=~s/[\d.]*\s[\d.]*\s([\d.]*).*/$1/eg
Sähe der entsprechende Eintrag dann so aus?
#DBLogging sysmon:stat_cpu_percent:::$val=~s/([\d.]*).*/$1/eg+s/[\d.]*\s([\d.]*).*/$1/eg+s/[\d.]*\s[\d.]*\s([\d.]*).*/$1/eg
Oder müssen die einzelnen Matches noch umklammert werden?
Viele Grüße,
Daniel
Hallo Daniel,
du addierst die Regex eher so:
$val=~s/([\d.]*).([\d.]*).([\d.]*).*/$1+$2+$3/ex
Du klammerst also die einzelnen Bestandteile und substituierst sie mit der Summe der einzelnen Matches.
Hier als Beispiel für die ersten drei Werte.
Grüße,
Heiko
Hallo Heiko,
nochmals danke!! Ich konnte es heute erfolgreich einbauen. Wenn man die Syntax kennt ist es plötzlich ganz einfach ;)
Schönes Wochenende und frohe Ostern :D
Daniel
:D danke und ebenso !
LG,
Heiko