使用«R»解析日志文件

使用«R»解析日志文件,r,csv,import,R,Csv,Import,我想从一些防火墙日志中获取所有源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="XXXX

我想从一些防火墙日志中获取所有源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所有代码都很好。str_split返回一个列表:

每个输入行有一个列表项,每个列表项是按空格分割的向量原始数据。我们可以将str_子集应用到每个列表项:

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条目:

我们也可以直接从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"

您应该显示输入文件的几行,以及一些您尝试过的代码,解释为什么它不起作用。dim为NULL并不表示它是一个向量,而是表示它是一个列表。str_split将返回一个列表。非常好用!谢谢
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"
sapply(b, str_subset, pattern = "^src=")
# [1] "src=XXX.XXX.XXX.XXX" "src=XXX.XXX.XXX.XXX" "src=XXX.XXX.XXX.XXX"
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"