使用awk和regex搜索两行之间的文本

我正在尝试通过使用awk和regex匹配包含文件中特定文本的两行之间的文本。

这是正则表达式:

(\ INVITE\ sip\:)(00|\+)(.*)@(?!((10.[1-2]47.(.*))|(172.(.*))))

我正尝试使用否定前瞻,以便从结果中排除特定的IP网络:10.147.0.0、10.247.0.0和172.0.0.0

这是我的awk声明:

awk '/(\ INVITE\ sip\:)(00|\+)(.*)@(?!((10.[1-2]47.(.*))|(172.(.*))))/{flag=1}/SOME TEXT/{flag=0}flag' file 

正则表达式本身工作正常,并且从下面的第一行示例返回所需的结果,但是如果我将其放在AWK中,它将不起作用。

  

邀请sip:+358XXXXXXX@10.147.XXX.XXX; user = phone SIP / 2.0

     

11/01 13:30:46.0​​00 172.16.171.80 local0.notice [S = 799368583]   [SID = 2a0cb4:31:22781827]邀请   sip:+ 4747XXXXXX; npdi; rn=+47XXXXXX@212.XXX.XXX.XXX; user =电话   SIP / 2.0

     

11/01 13:30:46.0​​00 172.16.171.80 local0.notice [S = 799368584]   [SID = 2a0cb4:31:22781827]邀请   sip:+ 47XXXXXX; npdi; rn=+47XXXXXX@172.XXX.XXX.XXX; user =电话   SIP / 2.0

     

11/01 13:30:46.0​​00 172.16.171.80 local0.notice [S = 799368789]   [SID = 2a0cb4:31:22781828]邀请   sip:00358XXXXXX@10.47.XXX.XXX; user =电话SIP / 2.0

没有负面的前瞻效果,因此返回的结果正是我要排除的结果。

ccxygc2008 回答:使用awk和regex搜索两行之间的文本

就像其他人所说的那样,awk不支持负面环视,而perl是更好的工具。

如果要避免使用perl并使用否定的环视功能,请使用tr将换行符更改为数据中未出现的另一个字符,然后用换行符替换该字符的两次出现-这将把您的两行一行上的序列为您提供了更多匹配选项,例如将grep与-P开关配合使用,以负向环视选择所需内容。

如果您承诺使用awk,则可以使用它来选择要消除的行,将其与源文件一起转储到文件中,进行排序,然后使用uniq -u消除(现在已加倍)条目不想。

本文链接:https://www.f2er.com/3165954.html

大家都在问