使用正则表达式从日志文件的最后一行获取 IP 地址

Posted

技术标签:

【中文标题】使用正则表达式从日志文件的最后一行获取 IP 地址【英文标题】:Get IP address from last line of log file using Regex 【发布时间】:2018-11-28 17:10:23 【问题描述】:

我正在尝试使用 Python Regex 从日志的最后一行获取 IP 地址。

如果我搜索整个日志,我可以获得一个 IP。例如:

with open("read.log", "r+") as log:
    for line in log:
        address = "^\d1,3.\d1,3.\d1,3.\d1,3$"
        match = re.match(address, line)

但是当我尝试只读取最后一行并获取 IP 地址时,我没有得到任何结果。我该如何解决这个问题?

import re

def run():

    try:
        logfile = open('read.log', 'r')
#       print ('First line in log: ',logfile.readline())

        for line in logfile:  
            x = line
            for ip in x:
                address = "^\d1,3.\d1,3.\d1,3.\d1,3$"
                match = re.match(address, ip)
                logfile.close   
        print ('Last Line: ', match)


    except OSError as e:
        print (e)

run()

我的 read.log 看起来像这样...

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.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

【问题讨论】:

您关闭logfile 太早了? (在 for 循环中) for ip in x 正在遍历该行的字符。 也许你打算使用x = line.split() @Barmar Iterate in characters of lines 对你来说不是必须的,re.match 已经为你做了。 IP总是第一个字段吗?只需使用ip = line.split()[0] 【参考方案1】:

问题是你的正则表达式。 ^ 匹配一行的开头,$ 结尾。如果你的日志行 /only/ 有 IP 地址,你的代码就可以工作。

>>> import re
>>> m = re.compile("^\d1,3.\d1,3.\d1,3.\d1,3$")
>>> m.search('123.123.123.123')
<_sre.SRE_Match object; span=(0, 15), match='123.123.123.123'>

但是,事实并非如此。以下更改将解决您的搜索问题:

>>> import re
>>> m = re.compile("(^\d1,3.\d1,3.\d1,3.\d1,3)\s")
>>> m.search('10.1.177.198 Tue Jun 19 09:28:38 CDT 2018').groups()[0]
>>> '10.1.177.198'

【讨论】:

以上是关于使用正则表达式从日志文件的最后一行获取 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

用于从电子邮件标头获取 IP 地址的正则表达式 [重复]

文本区域输入上的 JavaScript 正则表达式

获取系统的IP地址

splunk:从ip地址获取前三个数字

正则表达式获取除范围外的所有数字

使用正则表达式匹配 IP [重复]