Hallo,
ich habe jetzt schon einige Tutorials durchgearbeitet, aber irgendwie bleiben die regex für mich ein Buch mit fast sieben Siegeln.
Die Grundzüge verstehe ich so einigermaßen, die komplexeren Teile nicht mehr.:-(
Ich versuche mich gerade daran aus einem CustomReading, die für mich interessanten Sachen rauszuschnippeln.
Ich möchte das RAID System meines Servers überwachen und mittels Tablet UI den Status des RAIDs anzeigen.
Das CustomReading ruft "cat /proc/mdstat" auf und ergibt dann folgendes.
Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
2632384 blocks super 1.2 [2/2] [UU]
md2 : active raid1 sdb3[3] sda3[2]
920518464 blocks super 1.2 [2/2] [UU]
md1 : active raid1 sdb2[3] sda2[2]
52395904 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sdb1[0] sda1[1]
1048512 blocks [2/2] [UU]
unused devices:
Ich würde da gerne mit Regex die RAID-Devices "mdX", sowie die Devices sdaX und sdbX sowie die aktiven Platten "[2/2][UU]" rausschnipseln und dann mittels Tablet UI darstellen und zwar so:
<!-- RAID Status -->
<div class="top-space-2x">
<header class="big">RAID</header>
<div data-type="label"
data-device="sys.raid_status"
data-get="raid_status"
data-part="XXXXXXXXX"
class="cell">
</div>
</div>
Die XXXXXXXXX müssten durch das Regex ersetzt werden, hoffe ich.
Vielleicht bin ich ja auch auf dem komplett falschen Dampfer und man müßte das anders machen.
Kann mir da jemand helfen, ich möchte jetzt gar nicht eine Komplettlösung vorgekaut bekommen, ich würde diese vemaledeiten Regex gerne mal verstehen.:-/
gm
Das Problem ist, dass die Ergebnisse immer in zwei Zeilen stehen.
Geh mal auf regex101.com und teste folgendes:
Als regex:
(^md.).*(\[.\/.]).*(\[..])
Als teststring:
md3 : active raid1 sda4[2] sdb4[3] 2632384 blocks super 1.2 [2/2] [UU]
Dann siehst Du rechts im Ergebnis die drei gewünschten Werte in den Gruppen 1-3.
Wie man das Problem mit dem mehrzeiligen Input löst, fällt mir grade nicht ein...
Zitat von: betateilchen am 02 November 2017, 16:24:31
Das Problem ist, dass die Ergebnisse immer in zwei Zeilen stehen.
Wie man das Problem mit dem mehrzeiligen Input löst, fällt mir grade nicht ein...
Mit
(?s)
am Anfang, oder? Sowas in der Art?
(?s).*?(md.).*?(\[.\/.]).*?(\[..])
Oder so?
(?s).*?(md.).*?(sd..).*?(sd..).*?(\[.\/.]).*?(\[..])
mit Teststring:
Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
2632384 blocks super 1.2 [3/3] [U3]
md2 : active raid1 sdb3[3] sda3[2]
920518464 blocks super 1.2 [2/2] [U2]
md1 : active raid1 sdb2[3] sda2[2]
52395904 blocks super 1.2 [1/1] [U1]
md0 : active raid1 sdb1[0] sda1[1]
1048512 blocks [0/0] [U0]
ergibt
ZitatMatch1
Full match 0-100 `Personalities : [raid1]
md3 : active raid1 sda4[2] sdb4[3]
2632384 blocks super 1.2 [3/3] [U3]`
Group 1. 24-27 `md3`
Group 2. 43-47 `sda4`
Group 3. 51-55 `sdb4`
Group 4. 90-95 `[3/3]`
Group 5. 96-100 `[U3]`
Match 2
Full match 100-185 `
md2 : active raid1 sdb3[3] sda3[2]
920518464 blocks super 1.2 [2/2] [U2]`
Group 1. 107-110 `md2`
Group 2. 126-130 `sdb3`
Group 3. 134-138 `sda3`
Group 4. 175-180 `[2/2]`
Group 5. 181-185 `[U2]`
Match 3
Full match 185-269 `
md1 : active raid1 sdb2[3] sda2[2]
52395904 blocks super 1.2 [1/1] [U1]`
Group 1. 192-195 `md1`
Group 2. 211-215 `sdb2`
Group 3. 219-223 `sda2`
Group 4. 259-264 `[1/1]`
Group 5. 265-269 `[U1]`
Match 4
Full match 269-342 `
md0 : active raid1 sdb1[0] sda1[1]
1048512 blocks [0/0] [U0]`
Group 1. 276-279 `md0`
Group 2. 295-299 `sdb1`
Group 3. 303-307 `sda1`
Group 4. 332-337 `[0/0]`
Group 5. 338-342 `[U0]`
Danke erstmal, ich verstehe bei dem
(?s).*?(md.).*?(sd..).*?(sd..).*?(\[.\/.]).*?(\[..])
zwar nix, aber zumindest im regex tester gibt es ein mir passendes Ergebnis, eingetragen in das data-part Feld des Labelwidgets der UI gibt es einen Error.:-(
Was für einen Error?
Vermultich akzeptiert data-part mehrere Capturing Groups nicht...
ZitatWas für einen Error?
Error
fhem-tablet-ui.js:1613
ZitatVermultich akzeptiert data-part mehrere Capturing Groups nicht...
Ahja, heißt was?
Hab in Code nachgeschaut. Er sollte doch akzeptieren.
var matches = value.match(new RegExp('^' + part + '$'));
Etwas gefählt im nicht in der Regex...
Versuch mal erstmal mit nur (?s).*?(md.).*
Funktioniert leider auch nicht.
Wäre es möglich zu erklären, was der oben aufgeführte Regex-Ausdruck genau macht?
Das hier ist das Anfängerforum und da wäre es schön, wenn man ein paar erklärende Worte dazu bekäme.
Wenn Du es in https://regex101.com eingibst, wie schon von betateilchen erwähnt, wird alles oben rechts Schritt für Schritt erklärt.
ZitatFunktioniert leider auch nicht.
Und mit nur
(md.).*?(sd..).*?(sd..)
?