【问题标题】:Parsing log files with « R »使用 «R» 解析日志文件
【发布时间】:2018-09-10 14:21:51
【问题描述】:

我想从一些防火墙日志中获取所有源 IP。

首先,在导入具有不同行大小的日志时,您推荐哪种导入方法?

样本原始数据:

Sep  7 13:10:01 XXX.XXX.XXX.XXX id=firewall time="2018-09-07 13:10:01" fw="XXXXX-ISSP" tz=+0200 startime="2018-09-07 13:10:00" pri=5 confid=01 slotlevel=2 ruleid=102 srcif="vlan3" srcifname="XXXXX" ipproto=tcp dstif="vlan6" dstifname="XXXXX" proto=tcp5666 src=XXX.XXX.XXX.XXX srcport=55617 srcportname=ephemeral_fw_tcp srcname=XXXXX.service.noissp.XXXXX.corp srcmac=YY:YY:YY:YY:YY:YY dst=10.95.160.7 dstport=5666 dstportname=tcp5666 dstname=XXXXX.biz.noissp.XXXXX.corp modsrc=XXX.XXX.XXX.XXX modsrcport=55617 origdst=XXX.XXX.XXX.XXX origdstport=5666 ipv=4 sent=1412 rcvd=1596 duration=0.18 action=pass logtype="connection"
Sep  7 13:10:01 XXX.XXX.XXX.XXX id=firewall time="2018-09-07 13:10:01" fw="XXXXX-ISSP" tz=+0200 startime="2018-09-07 13:10:00" pri=5 confid=01 slotlevel=2 ruleid=810 srcif="vlan3" srcifname="XXXXX" ipproto=udp dstif="Ethernet18" dstifname="FTLAN-XXX" proto=syslog src=XXX.XXX.XXX.XXX srcport=36147 srcportname=ephemeral_fw_udp srcname=XXXXX.service.noissp.XXXXX.corp srcmac=YY:YY:YY:YY:YY:YY dst=XXX.CXX.CXX.XXX dstport=514 dstportname=syslog dstname=XXXXX ipv=4 action=block logtype="filter"
Sep  7 13:10:01 XXX.XXX.XXX.XXX id=firewall time="2018-09-07 13:10:01" fw="XXXXX-ISSP" tz=+0200 startime="2018-09-07 12:10:00" pri=5 confid=01 slotlevel=2 ruleid=273 srcif="vlan6" srcifname="XXXXX" ipproto=udp dstif="vlan6" dstifname="XXXXX" proto=dns_udp src=XXX.XXX.XXX.XXX srcport=60737 srcportname=XXX-dyn_tcp srcmac=YY:YY:YY:YY:YY:YY dst=XXX.XXX.XXX.XXX dstport=53 dstportname=dns_udp dstname=XXXXX-biznoIssp.biz.noissp modsrc=XXX.XXX.XXX.XXX modsrcport=60737 origdst=XXX.XXX.XXX.XXX origdstport=53 ipv=4 sent=54 rcvd=114 duration=0.00 action=pass logtype="connection"

我已尝试使用 read_line 来避免不同大小的行出现错误:

导入日志文件

rawdata <- read_lines(file="./input.txt")

去掉每一行的双引号

a <- gsub("\"" , "", rawdata)

将行拆分成多个字符串

b <- str_split(a, " ")

但此时b只是一个向量:

> dim(b)
NULL
> length(b)
[1] 10

str_subset(b, "src=") 返回整行而不是单列。 我做错了什么...

我如何提取这些信息?

【问题讨论】:

  • 您应该显示几行输入文件,以及您尝试过的一些代码,解释为什么它不起作用。
  • dim 为 NULL 并不表明它是一个向量,它表明它是一个 liststr_split 预计会返回一个列表。

标签: r csv import


【解决方案1】:

您的所有代码都很好。 str_split 返回list

class(b)
# [1] "list"

length(b)
# [1] 3
lengths(b)
# [1] 41 34 40

每个输入行都有一个列表项,每个列表项都是一个向量(原始数据由空格分割)。我们可以sapply(或lapplystr_subset到每个列表项:

sapply(b, str_subset, pattern = "src=")
# [[1]]
# [1] "src=XXX.XXX.XXX.XXX"    "modsrc=XXX.XXX.XXX.XXX"
# 
# [[2]]
# [1] "src=XXX.XXX.XXX.XXX"
# 
# [[3]]
# [1] "src=XXX.XXX.XXX.XXX"    "modsrc=XXX.XXX.XXX.XXX"

您可能想要修改正则表达式以排除 modrc 条目:

sapply(b, str_subset, pattern = "^src=")
# [1] "src=XXX.XXX.XXX.XXX" "src=XXX.XXX.XXX.XXX" "src=XXX.XXX.XXX.XXX"

我们也可以直接从rawdata 出发而无需拆分或任何其他操作:

str_extract_all(rawdata, pattern = "\\bsrc=[^ ]*")
# [[1]]
# [1] "src=XXX.XXX.XXX.XXX"
# 
# [[2]]
# [1] "src=XXX.XXX.XXX.XXX"
# 
# [[3]]
# [1] "src=XXX.XXX.XXX.XXX"

【讨论】:

  • 完美运行!谢谢!
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多