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