我当前正在搜索包含IP地址的日志文件。
日志示例:
10.1.177.198 Tue Jun 19 09:25:16 CDT 2018
10.1.160.198 Tue Jun 19 09:25:38 CDT 2018
10.1.177.198 Tue Jun 19 09:25:36 CDT 2018
10.1.160.198 Tue Jun 19 09:25:40 CDT 2018
10.1.177.198 Tue Jun 19 09:26:38 CDT 2018
10.1.177.198 Tue Jun 19 09:27:16 CDT 2018
10.1.177.198 Tue Jun 19 09:28:38 CDT 2018
我现在可以从日志的最后一行获取IP地址。我还可以搜索具有相同IP地址的所有行号。
如果日志中的最后一个IP地址在日志中列出了3次或更多次,我如何才能获得该IP地址倒数第三次出现的行号?
例如,我想要获取此行的行号:
10.1.177.198 Tue Jun 19 09:26:38 CDT 2018
或者更好的是,只打印整行。
下面是我的代码示例:
import re
def run():
try:
logfile = open('read.log', 'r')
for line in logfile:
x1 = line.split()[0]
for num, line in enumerate(logfile, 0):
if x1 in line:
print("Found " + x1 + " at line:", num)
print ('Last Line: ' + x1)
logfile.close
except OSError as e:
print (e)
run()
我列出了出现特定IP地址的所有行号。
print("Found " + x1 + " at line:", num)
我想打印行,其中"num“是行号列表中倒数第三个数字。
我的总体目标是从日志文件的最后一行获取IP地址。然后检查它之前是否被列出了3次以上。如果有,我希望找到地址的倒数第三个列表,并获得行号(或者只打印该行列出的地址和日期)。
发布于 2018-06-20 02:57:54
跟踪所有的事件,并打印最后一个事件的第三个事件。可以使用heapq
进行优化。
def run():
try:
logfile = open('log.txt', 'r')
ip_address_line_number = dict()
for index,line in enumerate(logfile,1):
x1 = line.split()[0]
log_time = line.split()[4]
if x1 in ip_address_line_number :
ip_address_line_number[x1].append((index,log_time))
else:
ip_address_line_number[x1] = [(index,log_time)]
if x1 in ip_address_line_number and len(ip_address_line_number.get(x1,None)) > 2:
print('Last Line: '+ ip_address_line_number[x1][-3].__str__())
else:
print(x1 + ' has 0-2 occurences')
logfile.close
except OSError as e:
print (e)
run()
发布于 2018-06-20 13:00:03
使用pandas
,这将是非常简短的:
import pandas as pd
df = pd.read_fwf('read.log', colspecs=[(None, 12), (13, None)], header=None, names=['IP', 'time'])
lastIP = df.IP[df.index[-1]]
lastIP_idx = df.groupby('IP').groups[lastIP]
n = 3
if len(lastIP_idx) >= n:
print('\t'.join(list( df.loc[lastIP_idx[-n]] )))
else:
print('occurence number of ' + lastIP + ' < ' + str(n))
https://stackoverflow.com/questions/50934908
复制相似问题