从结构化系统日志中提取数据



我有大约 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

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

172.17.6.0  123 10.78.0.0   123 junos-ntp

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

IMO 最好为此使用 sed

1.part - 提取双引号之间的值

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

解释:

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

替换模式仅输出捕获组1的内容 - 包装在空格中 - 并丢弃剩余的匹配项。

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


2.part - 将 IP 的最后一个八位字节替换为 0 s

您可以使用以下简单命令来匹配正则表达式。请注意,它甚至可以匹配像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
$ 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

最新更新