[英]Exporting IP Addresses using Python Script
我正在尝试创建一个脚本,该脚本将从出现的30次(相同地址)中提取IP地址(从文本文档中提取)。 找到后,我尝试将这些IP地址导出到单独的文本文档中。
这是我到目前为止所得到的:
import re
appears = 0
myLog = open('auth.log', 'r')
for line in myLog:
if re.match(("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"), line):
attempts +=1
print 'The number of times this IP Address appears is', appears
当我运行脚本时,在日志文件中找不到任何IP地址,其中有数百个,但是什么也没有找到。 正则表达式或不同事物的组合是否有问题?
我有没有机会创建正则表达式来搜索以下内容:
> Failed password for bin from 211.167.103.172
很抱歉,如果这有点模糊,它是Python的新手,仍然习惯了。
这里有两个问题。 第一个是正则表达式开头的插入号( ^
)。 这意味着“从字符串的开头开始搜索此模式”。 如果您的日志文件看起来像Failed password for xxx.xxx.xxx.xxx
,则开头的文本将使正则表达式无效。 另一个问题是.match
函数。 这将在字符串的开头开始搜索,就好像您在前面插入了插入符号一样。 将其替换为.search
,您应该会很好:
if re.search(("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"), line):
appears
变量是在for
循环之外设置的,因此,每次迭代一行时,都会重置该变量。
我将为每个IP声明一个计数字典,并在循环遍历时增加值:
import re ip_counts = {} myLog = open('auth.log', 'r') for line in myLog: match = re.search(("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$"), line) if match: ip = match.group() if ip not in ip_counts: ip_counts[ip] = 1 else: ip_counts[ip] += 1 for ip in ip_counts: count = ip_counts[ip] if count > 30: print('IP {} had {} attempts.'.format(ip, count))
朱拉走上正轨。 您也可以将正则表达式升级到以下内容:
(Failed).*?(password).*?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
它仅包括您要查找的行,而不包括所有带有ip地址的行。
但是我离正规表达式专家还很远,这可能并不完美。
你可以去这里玩正则表达式。
这是一个简化的表达式版本:
import re
from collections import Counter
e = re.compile(r'((\d{1,3}\.){3}\d{1,3})')
with open('log.txt') as f:
ips = Counter([e.search(line).group() for line in f if e.search(line)])
thirty_plus = [ip for ip,count in ips.most_common() if count > 30]
with open('results.txt', 'w') as f:
f.write('\n'.join(thirty_plus))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.