[英]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.