Hallo ich habe gerade ein kleines Problem mit regulären Ausdrücken und hoffe, dass mir hier jemand helfen kann.
Aus einer Ausgabe eines Programmes, möchte ich verschiedene Werte Auslesen.
Das Programm gibt für verschiedene Komponenten verschiedenste Daten aus, von denen ich immer die gleichen brauche.
Die Ausgabe sieht dabei folgendermaßen aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Mi 23. Mar 07:17:39 CEST 2008
qdisc htb 1: r2q 1 default 0 direct_packets_stat 416 ver 3.17
Sent 69203 bytes 416 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1111: parent 1:111 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1112: parent 1:112 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1123: parent 1:123 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1124: parent 1:124 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1125: parent 1:125 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1131: parent 1:131 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 1132: parent 1:132 limit 128p quantum 1514b flows 128/1024 perturb 10sec
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
class htb 1:132 parent 1:13 leaf 1132: prio 0 quantum 12500 rate 100000bit ceil 500000bit burst 1611b/8 mpu 0b overhead 0b cburst 1661b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 128960 ctokens: 26592
class htb 1:123 parent 1:12 leaf 1123: prio 0 quantum 12500 rate 100000bit ceil 1500Kbit burst 1611b/8 mpu 0b overhead 0b cburst 1786b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 128960 ctokens: 9530
class htb 1:11 parent 1:1 rate 400000bit ceil 2048Kbit burst 1649b/8 mpu 0b overhead 0b cburst 1855b/8 mpu 0b overhead 0b level 6
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 33000 ctokens: 7250
Die Datei beginnt immer mit dem aktuellen Datum gefolgt von einer Leerzeile.
Jetzt beginnt die eigentliche Ausgabe.
Hier kommen als erstes die "qdisc"-Blöcke die nicht durch eine Leerzeile getrennt werden. Danach kommen die "class"-Blöcke die durch eine Leerzeile getrennt werden.
Zum "qdisc"-Block:
Jeder Eintrag beginnt mit "qdisc" gefolgt von einem Typen und einer Zahl die mit Doppelpunkt getrennt wird. Hinter dem Doppelpunkt kann die Zahl fortgesetzt werden oder es folgt kein weiteres Zeichen. (bsp: "qdisc sfq 1111:" oder "qdisc htb 11:1")
Diesen Eintrag benötige ich, und zudem den Eintrag "Sent", "dropped" und "overlimits".
Das selbe gilt auch für die "class"-Blöcke.
Mein regex sieht zur Zeit wie folgt aus:
(qdisc\s\w*\s\w+\S\d*|class\s\S*\s\w+\S\d*)\s+.*\s*(Sent\s\d+).*(dropped\s\d+).*(overlimits\s\d+)(\S|\S*.*\s*.*)
Ich habe den Ausdruck mit einem entsprechenden Tool getestet, wo er auch funktioniert.
In Perl allerdings, bekomme ich keine Ausgabe.
Mein Perlscript sieht zur Zeit so aus:
my $file_to_read = "./stats.log";
open(my $in, "< $file_to_read") or die "Can't open file";
while(<$in>)
{
#print <$in>;
#print "\n\n";
if(<$in> =~ /(qdisc\s\w*\s\w+\S\d*|class\s\S*\s\w+\S\d*)\s+.*\s*(Sent\s\d+).*(dropped\s\d+).*(overlimits\s\d+)(\S|\S*.*\s*.*)/ )
{
print "$1 $2 $3 $4\n";
}
}
Anscheinend funktioniert es nicht, da die gesamte Datei in der Variablen liegt und nicht die einzelnen Einträge.
Kann mir da bitte jemand helfen, dass zum Laufen zu bekommen.
Vielen Dank,
dc