首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取文件中出现字符串的倒数第四行

获取文件中出现字符串的倒数第四行
EN

Stack Overflow用户
提问于 2018-06-20 02:34:06
回答 2查看 82关注 0票数 0

我当前正在搜索包含IP地址的日志文件。

日志示例:

代码语言:javascript
复制
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地址倒数第三次出现的行号?

例如,我想要获取此行的行号:

代码语言:javascript
复制
10.1.177.198 Tue Jun 19 09:26:38 CDT 2018

或者更好的是,只打印整行。

下面是我的代码示例:

代码语言:javascript
复制
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地址的所有行号。

代码语言:javascript
复制
print("Found " + x1 + " at line:", num)

我想打印行,其中"num“是行号列表中倒数第三个数字。

我的总体目标是从日志文件的最后一行获取IP地址。然后检查它之前是否被列出了3次以上。如果有,我希望找到地址的倒数第三个列表,并获得行号(或者只打印该行列出的地址和日期)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 02:57:54

跟踪所有的事件,并打印最后一个事件的第三个事件。可以使用heapq进行优化。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2018-06-20 13:00:03

使用pandas,这将是非常简短的:

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50934908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档