Regex Problem
deepc
- perl
Hallo zusammen,
ich habe folgendes Problem:
Aus einem Programm bekomme ich folgende Ausgabe zurück, die in einer Datei vorliegt:
<code>
qdisc ingress ffff:
Sent 23834782398743 bytes 8237923749 pkts (dropped 28834783, overlimits 2)
qdisc pfifo_fast 0: root bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 2207292 bytes 19196 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
class htb 1:11 parent 1:1 prio 0 quantum 13107 rate 1Mbit ceil 1Mbit burst 2909b/8 mpu 0b cburst 2909b/8 mpu 0b level 0
Sent 254574739 bytes 2188533 pkts (dropped 0, overlimits 0)
rate 10587bps 105pps
lended: 2188533 borrowed: 0 giants: 0
tokens: 22234 ctokens: 22234
</code>
Ein "Block" kann dabei entweder mit qdisc oder class beginnen.
Aus jedem Block brauche ich die Sent, dropped und overlimits Werte.
Zwischen qdiscs kann eine Leerzeile sein, muss aber nicht, ebenso bei den class Einträgen.
Bis jetzt habe ich folgendes versucht:
local $/ = "\n\n";
while ( my $block = <DATA> ) {
if ( $block =~ m/class\s+(\S+\s\S+).+(Sent\s\d+).*(dropped\s\d+),\s+(overlimits\s\d+)/ms ) {
print "$1 $2 $3 $4", $/;
Das Problem ist allerdings, dass zum Beispiel die erste Zeile nicht erkannte wird, und auch die Einträge zwischen denen keine Leerzeile ist, natürlich nicht erkannt werden.
Auf die Ausgabe des Programms habe ich keinen Einfluss, also muss ich mit den unterschiedlichen Formen umgehen.
Mein erster Gedanke war local auf dem Standard \n zu ändern, dann bekomme ich aber mit meiner RegEx keine Ausgabe.
Jemand eine Idee wie ich da weiter komme?
Was ich noch wichtiges vergessen habe (das machts eigentlich erst kompliziert), ich brauche aus der ersten Zeile jeweils die ID, also in der ersten Zeile z.B. ffff: oder im class Block z.B. 1:11
gudn tach!
Was ich noch wichtiges vergessen habe [...] ich brauche aus der ersten Zeile jeweils die ID, also in der ersten Zeile z.B. ffff: oder im class Block z.B. 1:11
my $id='';
while(<DATA>){
if(/^(?:qdisc [a-z_]+ ([a-f0-9]+):|class [a-z_]+ ([^ ]+))/){
$id = defined $1 ? $1:$2;
# oder ab perl 5.10 kurz: $id = $1 // $2;
}else{
print "$id: $1 $2 $3 $4" if /^ (Sent \d+).*(dropped \d+), +(overlimits \d+)/;
}
}
hab's nicht ausprobiert. idee (zeilenweises durchforsten, merken der id) sollte aber klar sein.
prost
seth