我有大约30k结构化syslog消息,格式如下:
<14>1 2015-03-10T15:08:06.049Z ams99-fwc-a15-3600-01 RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2636.1.1.1.2.34 source-address="172.17.6.11" source-port="123" destination-address="10.78.0.13" destination-port="123" service-name="junos-ntp" nat-source-address="172.17.6.11" nat-source-port="123" nat-destination-address="10.78.0.13" nat-destination-port="123" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="17" policy-name="ntp-access" source-zone-name="network-management" destination-zone-name="wan" session-id-32="140046548" username="N/A" roles="N/A" packet-incoming-interface="reth0.990" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN"]
我只需要提取倒置昏迷之间的数据“.”所以要弄到这样的东西:
172.17.6.11 123 10.78.0.13 123 junos-ntp 172.17.6.11 123 10.78.0.13 123 None None 17我还需要将所有IP地址的最后一个八进制替换为0。这样它就可以到达:
172.17.6.0 123 10.78.0.0 123 junos-ntp你能告诉我。我成功地用awk完成了它,首先使用“然后”,作为字段分隔符,但我想知道您是否可以帮助我以更高效和更智能的方式完成它。
发布于 2015-03-10 22:03:44
海事组织最好使用sed:
1.双引号之间的部分提取值
sed -r 's/[^"]*"([^"]+)"[^"]*/ \1 /g' /var/log/syslog解释:
我正在使用替代命令s。搜索模式搜索一个或多个非"字符,直到到达"为止。以下非"字符将被捕获到捕获组1中,直到下一个"。在结束"之后,它匹配以下非"字符(这在行尾很重要)。
替换模式只是输出捕获组1的内容--用空格包装--并抛出其余的匹配。
使用g选项告诉sed在行中多次应用s命令。
第2部分-用0**s**替换IP的最后一个八进制
可以使用下面的简单命令来匹配regex。注意,它甚至会匹配像999.999.999.999这样的字符串,而这不是IP。然而,对于一个例子来说,regex应该足够好:
sed -r 's/([0-9]{1,3}(\.([0-9]{1,3}){2})\.([0-9]+))\.[0-9]+/\1.0/g' /var/log/syslog解释:
我再次使用s命令。搜索模式捕获与点相连的1到3个数字的序列,并将它们存储在捕获组1中。在此之后,在捕获组之外,IP的第四部分被匹配。
在替换模式中,打印捕获组1的内容,并添加.0。
g选项用于替换行中的所有is。
注意:上面的模式只适用于IPv4地址。
把它放在一起
您可以通过;简单地分离多个sed命令
sed -r 's/[^"]*"([^"]+)"[^"]*/ \1 /g;s/([0-9]{1,3}(\.([0-9]{1,3}){2})\.([0-9]+))\.[0-9]+/\1.0/g' /var/log/syslog发布于 2015-03-10 23:57:44
$ awk -F'"' '{for (i=2;i<=NF;i+=2) printf "%s%s", $i, (i<(NF-1)?OFS:ORS)}' file
172.17.6.11 123 10.78.0.13 123 junos-ntp 172.17.6.11 123 10.78.0.13 123 None None 17 ntp-access network-management wan 140046548 N/A N/A reth0.990 UNKNOWN UNKNOWN UNKNOWN用GNU awk表示gensub():
$ awk -F'"' '{for (i=2;i<=NF;i+=2) { $i=gensub(/([0-9]+\.[0-9]+\.[0-9]+\.).*/,"\\10","",$i); printf "%s%s", $i, (i<(NF-1)?OFS:ORS) } }' file
172.17.6.0 123 10.78.0.0 123 junos-ntp 172.17.6.0 123 10.78.0.0 123 None None 17 ntp-access network-management wan 140046548 N/A N/A reth0.990 UNKNOWN UNKNOWN UNKNOWNhttps://stackoverflow.com/questions/28974309
复制相似问题