Python - 拆分日志并搜索特定的东西

时间:2012-03-09 13:52:38

标签: python

我有一项任务,我想知道你是否可以提供帮助。对于部分问题,我需要分析系统日志。该日志包含时间和日期等信息,如果尝试进行root访问以及尝试来自哪个ip地址。

我的问题是:如何循环日志并拔出IP地址。

myFile = open('syslog','r') 
for line in myFile.readlines():
list_of_line = line.split(' ')

所以我在这里拆分了列表但是如何循环尝试找到一个IP地址。以前我使用过位置,但这不实用,因为它只查找一个地址。我希望它能够搜索并查找所有地址,这样就意味着寻找具有一定长度的字符串,例如xxx.xxx.xx.xx作为IP地址并指定我正在寻找数值。

编辑 -

Jan 10 09:32:07 j4-be03 sshd[3876]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35  user=root
Jan 10 09:32:09 j4-be03 sshd[3876]: Failed password for root from 218.241.173.35 port 47084 ssh2
Jan 10 09:32:17 j4-be03 sshd[3879]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35  user=root
Jan 10 09:32:19 j4-be03 sshd[3879]: Failed password for root from 218.241.173.35 port 47901 ssh2   
Jan 10 09:32:26 j4-be03 sshd[3881]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35  user=root
Jan 10 09:32:29 j4-be03 sshd[3881]: Failed password for root from 218.241.173.35 port 48652 ssh2

我被告知要忽略包含pam_unix的行,并将注意力集中在包含“root的密码失败”的行,因为它们是重复的条目。即将尝试正则表达式虽然我真的不明白发生了什么。

3 个答案:

答案 0 :(得分:1)

  • 预选包含您可以使用if s in line
  • 的特定字符串的行
  • 提取ip你可以利用你知道在ip
  • 之前/之后的字符串的事实

Example

prefix = "Failed password for root from"
def extract_ip(line):
    # get string between `prefix` and 'port'
    return line.partition(prefix)[2].partition('port')[0].strip()

with open('syslog') as f:
     ips = [extract_ip(line) for line in f if prefix in line]

一般来说,正则表达式可以标记输入。

答案 1 :(得分:0)

一个解决方案(虽然有点笨拙)是使用句点作为分隔符来分割list_of_line中的每个字符串。一旦你完成了,你可以检查你生成的数组是4个项目,这表明它是一个IP,然后你可以从list_of_line获取原始字符串并做你需要的任何事情用它。你想要一些伪代码吗?

注意:虽然这种方法简单易读,但确实存在一些缺点。首先,它可能有点慢,但如果这是一个任务,速度很可能不是真正的问题。其次,您可能在list_of_line中有其他与IP格式相同的项目(我认为这不太可能),在这种情况下,您的IP列表中会得到非IP结果。只需要注意几点。

另一种解决方案是使用Python的Regex功能 - 你可以只使用Google获取更多信息,这有点复杂。

答案 2 :(得分:0)

import re
myFile = open('syslog','r') 
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', myFile.read() )
print ip

难道你不喜欢python吗?