Python - 在日志文件中查找特定的mac地址

时间:2016-07-19 15:26:58

标签: python regex linux mac-address logfile

我想从可以以不同格式显示的日志文件中提取特定的Mac地址。

例如,在这三行上:

Jun 16 10:24:28(2248)登录确定:cli 88-c9-d0-fd-13-65通过TLS隧道)

Jun 16 10:24:35(2258)登录确定:cli f8:a9:d0:72:0:dd通过TLS隧道)

Jun 16 10:24:44(2273)登录OK:cli 485a.3f12.a35a通过TLS隧道)

这个正则表达式:

([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2} 

我可以在linux命令 less 中显示所有的mac地址。

假设搜索 48:5a:3f:12:a3:5a ,如何在Python中使用与特定mac地址相同的语法?

我试着写这样的东西:

regex = re.compile(r'([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}')

for line in file:
   match = regex.search(line)

但很明显它不起作用。

1 个答案:

答案 0 :(得分:0)

您可以使用

r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}|(?:\.?[a-f0-9]{2}){5})\b'

请参阅regex demo(使用re.I标志编译正则表达式对象。)

<强>解释

  • \b - 领先的字边界
  • [a-f0-9]{2} - 2 xdigits
  • (?: - 启动具有2种替代模式的非捕获组:
    • ([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}
      • ([:-]?) - 第1组捕获的分隔符为:-
      • [a-f0-9]{2} - 2 xdigits
      • (?:\1[a-f0-9]{2}){4} - 第1组中的4个分隔符序列和2个xdigits
    • | - 或
    • (?:\.?[a-f0-9]{2}){5}) - 5个可选(1或9)点(\.?)和2个xdigits的序列。
  • \b - 尾随字边界

Sample Python demo

import re
p = re.compile(r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:\1[a-f0-9]{2}){4}|(?:\.?[a-f0-9]{2}){5})\b', re.IGNORECASE)
s = "Jun 16 10:24:28 (2248) Login OK: cli 88-c9-d0-fd-13-65 via TLS tunnel)\nJun 16 10:24:35 (2258) Login OK: cli f8:a9:d0:72:0a:dd via TLS tunnel)\nJun 16 10:24:44 (2273) Login OK: cli 485a.3f12.a35a via TLS tunnel)"
print([x.group() for x in p.finditer(s)])
# =>  ['88-c9-d0-fd-13-65', 'f8:a9:d0:72:0a:dd', '485a.3f12.a35a']