我正在努力获取正确的正则表达式,以便仅当“联系人”地址与 ~70GB 的 SIP 消息中的 10.0.xx 匹配时,才专门匹配“联系人”和“用户代理”。
SIP 消息始终包含“联系人”和“用户代理”,然而它们可以位于任何位置,且“用户代理”始终位于“联系人”之后。
“如果‘联系人’与 10.0.xx 匹配,则也获取‘用户代理’”。
CSeq: 756 REGISTER
10.0.54.20;branch=z9hG4bK314690454165BD2A;rport=49419;received=133.55.155.196
Contact: <sip:[email protected]: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
我可以匹配联系人,但是我无法拉取用户代理。
sed -rn 's/.*(^Contact: .*?10\.0\.[0-9]{0,3}\.[0-9]{0,3}).*/\1/p' XSLog2013.01.31-23.31.29.txt
输出:联系人:sip:[电子邮件保护]
我没有得到任何输出:
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
答案1
你尝试做的是多行匹配。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 中的多行正则表达式的信息。