Извлечь из большого файла по многострочному паттерну (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 шт):

Автор решения: Zt.

можно ориентироваться только на то, что он начинается с <--- 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/"
→ Ссылка