首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从结构化syslog中提取数据

从结构化syslog中提取数据
EN

Stack Overflow用户
提问于 2015-03-10 21:21:03
回答 2查看 1K关注 0票数 0

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

我只需要提取倒置昏迷之间的数据“.”所以要弄到这样的东西:

代码语言:javascript
复制
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。这样它就可以到达:

代码语言:javascript
复制
172.17.6.0  123 10.78.0.0   123 junos-ntp

你能告诉我。我成功地用awk完成了它,首先使用“然后”,作为字段分隔符,但我想知道您是否可以帮助我以更高效和更智能的方式完成它。

EN

回答 2

Stack Overflow用户

发布于 2015-03-10 22:03:44

海事组织最好使用sed

1.双引号之间的部分提取值

代码语言:javascript
复制
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应该足够好:

代码语言:javascript
复制
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命令

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-03-10 23:57:44

代码语言:javascript
复制
$ 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():

代码语言:javascript
复制
$ 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28974309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档