Назад | Перейти на главную страницу

Регулярное выражение, соответствующее конкретным деталям, если первое совпадение существует, многострочное

Я изо всех сил пытаюсь получить правильное регулярное выражение, которое бы соответствовало определенному контакту и пользовательскому агенту, только если адрес контакта соответствует 10.0.x.x в ~ 70 ГБ сообщений SIP.

Сообщение SIP всегда будет содержать «Контакт» и «Пользователь-агент», однако они могут находиться в любом месте, а «Пользователь-агент» всегда после «Контакт».

«Если« Контакт »соответствует 10.0.x.x, возьмите и« Пользовательский агент »».

CSeq: 756 REGISTER
10.0.54.20;branch=z9hG4bK314690454165BD2A;rport=49419;received=133.55.155.196
Contact: <sip:43498234985@10.0.23.71:5060;transport=udp>;methods="INVITE, ACK, BYE,           CANCEL, OPTIONS, INFO, MESSAGE, SUBSCRIBE, NOTIFY, PRACK, UPDATE, REFER";expires=3600
Accept-Language: en-gb,en;q=0.9
User-Agent: PolycomSoundPointIP-SPIP_331-UA/4.0.2.11307
Max-Forwards: 69

Я могу сопоставить контакт, но я просто не могу вытащить User-Agent.

sed -rn 's/.*(^Contact: .*?10\.0\.[0-9]{0,3}\.[0-9]{0,3}).*/\1/p' XSLog2013.01.31-23.31.29.txt

Выходы: Контакт: sip: 442023482890@10.0.23.71

Я не получаю вывода:

sed -rn 's/.*(^Contact: .*?10\.0\.[0-9]{0,3}\.[0-9]{0,3}).*?(^User-Agent:.*?$).*/\1\2/p' XSLog2013.01.31-23.31.29.txt

Что вы пытаетесь сделать, так это сопоставление нескольких строк. Многострочное регулярное выражение в sed действительно сложно. Если вы можете понять что-то вроде

sed -rn '/^Contacts/ h;/^User/ h;/^Contact/^User/ {s/(Con.*User)/xx/g;p;n;h};h' inputfile

и значение этих; и h и n, тогда у вас есть ответ.

Если вы не понимаете, более простой способ - создать сценарий на многострочном регулярном выражении, поддерживающем ваш любимый язык. Например, сценарий PHP будет выглядеть следующим образом:

$contact = "";
$fp=fopen ($inputfile, 'r');
while(!feof($fp))
{
 $l = fgets($fp);
 if (preg_match('!^(Contact: .*?10\.0\.[0-9]{0,3}\.[0-9]{0,3})!', $l, $match))
 {
  $contact = $match[1];
 }
 if (preg_match('!^User-agent!', $l) && '' != $contact)
 {
  echo $contact."\n".$l."\n=======\n";
  $contact = "";
 }
}

затем беги с php -f script.php

Вы также можете найти в Google многострочное регулярное выражение в sed.