找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 7283|回复: 11

[已解决] 关于python匹配日志中的IP,并输出

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花 发表于 2016-8-11 12:04:00 | 显示全部楼层 |阅读模式
由于做日志分析,所以产生了一个需求,就是匹配日志中的IP地址,然后输出,日志样本如下:

|58229|NULL|2016-08-09 18:25:54|2016-08-09 18:16:40|NULL|5|10.48.128.49| 5156: Windows 筛选平台已允许连接。 应用程序信息: 进程 ID: 5776 应用程序名称: \device\harddiskvolume3\oracle\product\11.2.0\dbhome_1\jdk\bin\java.exe 网络信息: 方向: 出站 源地址: 10.48.128.49 源端口: 52562 目标地址: 10.48.128.49 目标端口: 1521 协议: 6 筛选器信息: 筛选器运行时 ID: 65949 层名称: 连接 层运行时 ID: 48|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|Security-Auditing:|NULL|NULL|NULL


我的做法是,打开日志文件,读取文件第一行(因为IP就在第一行),然后用正则匹配输出IP,但是提示,“语法错误”,求大神解答~!~!~,代码如下:

all_text= open('E:\\日志审计结果\\text.txt','r'):   
p=all_text.readlines()[1]
re.findall(r'\d+.\d+.\d+.\d+',p)
all_text.close()

回复

使用道具 举报

5

主题

101

帖子

101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
101

最佳新人活跃会员热心会员突出贡献

QQ
落叶秋风 发表于 2016-8-11 21:11:38 | 显示全部楼层
all_text= open('E:\\日志审计结果\\text.txt','r'):    这句代码最后怎么有个冒号,而且代码我测试过,是匹配的到IP的,敲代码要仔细啊,欢迎遇到问题再提问
回复 支持 1 反对 0

使用道具 举报

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花  楼主| 发表于 2016-8-11 12:29:10 | 显示全部楼层
环境是python2.7
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-8-12 07:10:00 | 显示全部楼层
落叶秋风 发表于 2016-8-11 21:11
all_text= open('E:\\日志审计结果\\text.txt','r'):    这句代码最后怎么有个冒号,而且代码我测试过,是 ...

正解
回复 支持 反对

使用道具 举报

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花  楼主| 发表于 2016-8-12 10:19:50 | 显示全部楼层
落叶秋风 发表于 2016-8-11 21:11
all_text= open('E:\\日志审计结果\\text.txt','r'):    这句代码最后怎么有个冒号,而且代码我测试过,是 ...

是我太不小心了,谢谢~!已采纳。可不可以再请教一个问题,如果一个字符串中有多个IP,如何只输出第一个或者第二个。或者前2个IP。。
回复 支持 反对

使用道具 举报

5

主题

101

帖子

101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
101

最佳新人活跃会员热心会员突出贡献

QQ
落叶秋风 发表于 2016-8-12 10:46:45 | 显示全部楼层
阿花花花 发表于 2016-8-12 10:19
是我太不小心了,谢谢~!已采纳。可不可以再请教一个问题,如果一个字符串中有多个IP,如何只输出第一个 ...

这个简单,你用的re.findall返回的是匹配到的IP列表,这一个列表你知道怎么操作了吧,想要其中第几个就输出第几个就好
回复 支持 反对

使用道具 举报

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花  楼主| 发表于 2016-8-12 10:57:41 | 显示全部楼层
落叶秋风 发表于 2016-8-12 10:46
这个简单,你用的re.findall返回的是匹配到的IP列表,这一个列表你知道怎么操作了吧,想要其中第几个就输 ...

已采纳,多谢告知!大神,小弟还有一个问题,,如何在一个日志文件中去重输出所有IP
回复 支持 反对

使用道具 举报

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花  楼主| 发表于 2016-8-12 11:18:54 | 显示全部楼层
落叶秋风 发表于 2016-8-12 10:46
这个简单,你用的re.findall返回的是匹配到的IP列表,这一个列表你知道怎么操作了吧,想要其中第几个就输 ...

请问,那如何去重输出所有IP呢!~在不知道IP有多少个的情况下
回复 支持 反对

使用道具 举报

5

主题

101

帖子

101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
101

最佳新人活跃会员热心会员突出贡献

QQ
落叶秋风 发表于 2016-8-12 13:38:21 | 显示全部楼层
阿花花花 发表于 2016-8-12 11:18
请问,那如何去重输出所有IP呢!~在不知道IP有多少个的情况下

如果想保证IP顺序的话这么写
IPList = re.findall(r'\d+.\d+.\d+.\d+', p)
IP = []
for ip in IPList:
    if ip not in IP:
        IP.append(ip)
    else:
        pass
print IP
输出的IP就是去重的IP列表,还有其实你是可以知道其中有几个元素的,len(IPList)即可,就可以知道列表中有几个元素,如果不考虑顺序,那有更快的方法。欢迎有不懂的继续提问。
回复 支持 反对

使用道具 举报

7

主题

25

帖子

25

积分

贫民

积分
25
阿花花花  楼主| 发表于 2016-8-12 19:33:20 | 显示全部楼层
落叶秋风 发表于 2016-8-12 13:38
如果想保证IP顺序的话这么写
IPList = re.findall(r'\d+.\d+.\d+.\d+', p)
IP = []

原来是版主大大,多谢版主大大,,这个这个代码中ip是什么!~变量么?好像没有赋值哎
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表