使用 awk 进行数据提取操作

使用 awk 进行数据提取操作

我有一个 snort.rule 文件,我需要从行中提取 cve 编号,后跟参考键,并将它们附加回味精花括号内同一行的田地,下面是旧原木。

警报 udp $HOME_NET 1900 -> 任何任何(msg:“ET INFO UPnP 发现搜索响应易受攻击的 UPnP 设备 2”;内容:“面向 UPnP 设备的英特尔 SDK”;pcre:“/^Server\x3a[^\r\n] *用于 UPnP 设备/mi 的英特尔 SDK”;参考:/infosec/blog/2013/01/29;参考:arch/UPnP-arch-DeviceArchitecture-v1.1.pdf;参考:cve,2012-5958;参考:cve ,2012-5959;sid:2016303;修订版:4;)

所需的输出如下,粗体是新的更改,

警报 udp $HOME_NET 1900 -> 任何任何 (msg:"ET INFO UPnP 发现搜索响应易受攻击的 UPnP 设备 2{cve,2012-5958 cve,2012-5959}"; content:"面向 UPnP 设备的英特尔 SDK"; pcre:"/^Server\x3a[^\r\n]*面向 UPnP 设备的英特尔 SDK/mi"; 参考: /infosec/blog/2013/01/29;参考:arch/UPnP-arch-DeviceArchitecture-v1.1.pdf;参考:cve,2012-5958;参考:cve,2012-5959;sid:2016303;)

我对下面的 awk 代码确实有问题,它在显示结果时删除所有键之间的分号,最后一个子函数是罪魁祸首,我需要更正以下代码:

awk -F\; '
{
  for ( i = 1 ; i <= NF ; i++ ) {
    if ( $i ~ "msg" )
      a = i
    if ( $i ~ "reference:cve," ) {
      b = $i
      sub ( ".*:" , "" , b )
      c = c " " b 
      }
    }
  sub ( "$" , "{" c "\"}" , $a )
} 1' snort.rule

答案1

我会perl在这里使用

perl -pe '$" = " "; @cves = /reference:\s*(cve,\d+-\d+)/g;
   s/msg:\s*"(?:\\.|[^\\"])*\K/ {@cves}/ if (@cves)'

还处理msg嵌入的\"

相关内容