2016-11-12 2 views
0

nehme ich eine große Protokolldatei erhalten haben, ähnlich wie diese:Extrahieren von Daten aus einem mehrzeiligen Sitzung/Job-Protokolle mit awk mit überlappenden Linien

[2016-11-11 16:41:06.062] <sid:111> start1 
[2016-11-11 16:41:06.062] <sid:111> op <555> 
[2016-11-11 16:41:06.063] <sid:111> op <666> 
[2016-11-11 16:41:07.124] <sid:222> start1 
[2016-11-11 16:41:07.125] <sid:111> end 
[2016-11-11 16:41:07.123] <sid:222> op <777> 
[2016-11-11 16:41:08.333] <sid:333> start2 
[2016-11-11 16:41:08.352] <sid:333> op <888> 
[2016-11-11 16:41:08.352] <sid:333> op <999> 
[2016-11-11 16:41:09.062] <sid:333> end 
[2016-11-11 16:41:09.100] <sid:222> op <222> 
[2016-11-11 16:41:09.100] <sid:222> op <333> 
[2016-11-11 16:41:09.100] <sid:222> end 

Und wenn ich wissen muss, was sind die operation Nummer für jede Sitzung, die mit start1 beginnt:

<sid:111> <555> 
<sid:111> <666> 
<sid:222> <777> 
<sid:222> <222> 
<sid:222> <333> 

Wie kann ich das mit awk (oder etwas anderes), wenn eine hohe Wahrscheinlichkeit besteht, dass gleichzeitige Sitzungen parallel ausgeführt werden, und dass die Linien sind nicht alle zusammen.

Ich habe mit folgendem awk Skript versucht:

awk ' 
    BEGIN { 
     seen_start = 0; 
     seen_end = 1; 
    } 
    !seen_start && seen_end && $0 ~ /start1/ { 
     match($0, "(<sid:[a-f0-9]+>) start1", m); 
     sid = m[1]; 
     seen_start = 1; 
     seen_end = 0; 
    } 
    seen_start && !seen_end && $0 ~ sid && $0 ~ /op/ { 
     match($0, "op (<[0-9]+>)", m); 
     print sid, m[1]; 
    } 
    seen_start && !seen_end && $0 ~ sid && $0 ~ /end/ { 
     seen_start = 0; 
     seen_end = 1; 
    } 
' test 

Aber ich die Sitzungen beginnen in der Mitte eines anderen verpassen.

<sid:111> <555> 
<sid:111> <666> 

Dank

Antwort

0

I

mit Perl endete
#!/usr/bin/perl 

my %hash; 
while (<>) { 
    if (/(<sid:[a-f0-9]+>) start1/) { 
     $hash{$1} = 1; 
    } 
    elsif (/(<sid:[a-f0-9]+>) op (<[0-9]+>)/) { 
     if (exists $hash{$1}) { 
      print "$1 $2\n"; 
     } 
    } 
    elsif (/(<sid:[a-f0-9]+>) end/) { 
     if (exists $hash{$1}) { 
      delete $hash{$1}; 
     } 
    } 
} 
2

awk Einzeiler

awk -F '[:<>]' '/start1/ {a[$5]; next} /end/ {delete a[$5]; next} /op/ && $5 in a {print $5, $7}' test 

Erklärung

awk -F '[:<>]' '     # Split on either :, <or> 
    /start1/ {a[$5]; next}  # Note that the session has started 
    /end/ {delete a[$5]; next} # note session ended 
    /op/ && $5 in a {    # print if session has started 
     print $5, $7 
    } 
' 
Verwandte Themen