Извлечь из большого файла по многострочному паттерну (sed/grep/perl/awk)
Есть большой лог-файл (>10гб), в котором, помимо всего прочего, пишутся sip-логи, формата:
... другие логи ...
<--- SIP read from UDP:10.10.143.143:7000 --->
INVITE sip:[email protected] SIP/2.0
From: ...
... N-строк ...
Call-ID: [email protected]
... M-строк ...
<------------->
... другие логи ...
<--- SIP read from UDP:10.10.143.143:7000 --->
BYE sip:[email protected] SIP/2.0
From: ...
... L-строк ...
Call-ID: [email protected]
... K-строк ...
<------------->
... другие логи ...
И задача состоит в том, чтобы вытащить в отдельный файл все sip сообщения по определенному ID, т.е. для 55555-33333-ID-asdf, из примера выше, получить файл:
<--- SIP read from UDP:10.10.143.143:7000 --->
INVITE sip:[email protected] SIP/2.0
From: ...
...
Call-ID: [email protected]
...
<------------->
<--- SIP read from UDP:10.10.143.143:7000 --->
ACK sip:[email protected] SIP/2.0
From: ...
...
Call-ID: [email protected]
...
<------------->
...
<--- SIP read from UDP:10.10.143.143:7000 --->
BYE sip:[email protected] SIP/2.0
From: ...
...
Call-ID: [email protected]
...
<------------->
Каким образом это можно получить? Смотрел в сторону sed, но не смог разобраться, как найдя строку с паттерном cодержащим ID Call-ID: [email protected] добавить в пространство шаблона строки до паттерна:
<--- SIP read from UDP:10.10.143.143:7000 --->
INVITE sip:[email protected] SIP/2.0
From: ...
...
Если пространство шаблона начинать с <--- SIP read from UDP:10.10.143.143:7000 ---> и добавлять в него строки, то не будет ли это через чур затратно? в логе больше миллиона таких sip-сообщений, из которых с нужным ID - 3-5шт. (имхо по этому логичней сначала найти паттерн с ID и плясать от этого)
Пробовал grep, но есть проблема, что длина sip-сообщений разная, и можно ориентироваться только на то, что он начинается с <--- SIP read from UDP:10.10.143.143:7000 ---> и заканчивается <------------->
С perl не смог разобраться, и не знаю как он с большими файлами, дружит? Поделитесь опытом. Может у кого-то есть решение?
Ответы (1 шт):
можно ориентироваться только на то, что он начинается с
<--- SIP read from UDP:10.10.143.143:7000 --->и заканчивается<------------->содержащим
ID Call-ID: [email protected]
X="<--- SIP read from UDP:10.10.143.143:7000 --->"
Y="Call-ID: [email protected]"
Z="<------------->"
awk "/$X/,/$Z/" file.log | awk "BEGIN{RS=ORS=\"$Z\"}/$Y/"