使用正则表达式从日志文件的最后一行获取 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 地址的主要内容,如果未能解决你的问题,请参考以下文章