我有以下格式的大约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做了,首先使用“然后”。“作为一个字段分隔符,但我想知道你是否可以帮助我以更有效和更智能的方式做到这一点。
答案 0 :(得分:1)
IMO最好使用sed
:
<强> 1。 part - 在双引号之间提取值
sed -r 's/[^"]*"([^"]+)"[^"]*/ \1 /g' /var/log/syslog
说明:
我正在使用替换命令s
。搜索模式会搜索一个或多个非"
个字符,直到达到"
为止。在下一个"
之前,以下非"
字符将被捕获到捕获组1
中。在结束"
之后,它匹配以下非"
个字符(这在行尾很重要)。
替换模式只输出捕获组1
的内容 - 包裹在空格中 - 并抛弃剩余的匹配。
使用g
选项告诉sed每行多次应用s
命令。
<强> 2。 part - 用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
答案 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