从结构化syslog中提取数据

时间:2015-03-10 21:21:04

标签: regex awk syslog

我有以下格式的大约30k结构化系统日志消息:

  

<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

我还需要用0替换所有IP地址的最后一个八位字节。所以它可以到达:

172.17.6.0  123 10.78.0.0   123 junos-ntp

你能告诉我吗?我设法用awk做了,首先使用“然后”。“作为一个字段分隔符,但我想知道你是否可以帮助我以更有效和更智能的方式做到这一点。

2 个答案:

答案 0 :(得分:1)

IMO最好使用sed

<强> 1。 part - 在双引号之间提取值

sed -r 's/[^"]*"([^"]+)"[^"]*/ \1 /g' /var/log/syslog

说明:

我正在使用替换命令s。搜索模式会搜索一个或多个非"个字符,直到达到"为止。在下一个"之前,以下非"字符将被捕获到捕获组1中。在结束"之后,它匹配以下非"个字符(这在行尾很重要)。

替换模式只输出捕获组1的内容 - 包裹在空格中 - 并抛弃剩余的匹配。

使用g选项告诉sed每行多次应用s命令。


<强> 2。 part - 用0 s

替换IP的最后一个八位字节

您可以使用以下简单命令来匹配正则表达式。请注意,它甚至会匹配999.999.999.999之类的字符串,而这不是IP。但是正则表达式应该足够好了一个例子:

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选项用于替换该行中的所有IP。

注意:上述模式仅适用于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

答案 1 :(得分:0)

$ 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 for 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 UNKNOWN