Python - 在日志文件中查找特定的 mac 地址
Python - Find a specific mac address in a log file
我想从可以不同格式显示的日志文件中提取特定的 Mac 地址。
例如,在这三行中:
6 月 16 日 10:24:28 (2248) 登录成功:cli 88-c9-d0-fd-13-65 通过 TLS 隧道)
6 月 16 日 10:24:35 (2258) 登录成功:cli f8:a9:d0:72:0a:dd 通过 TLS 隧道)
6 月 16 日 10:24:44 (2273) 登录成功:cli 485a.3f12.a35a 通过 TLS 隧道)
使用这个正则表达式:
([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}
我可以带出所有mac地址,在linux命令less.
内
假设要搜索 48:5a:3f:12:a3:5a,我如何在 [=48] 中对特定 mac 地址应用相同的语法=]?
我试着写这样的东西:
regex = re.compile(r'([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}')
for line in file:
match = regex.search(line)
但显然不行
您可以使用
r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:[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}(?:[a-f0-9]{2}){4}
:
([:-]?)
- 第 1 组捕获一个 :
或 -
的定界符
[a-f0-9]{2}
- 2 xdigits
(?:[a-f0-9]{2}){4}
- 第 1 组中的 4 个定界符序列和 2 个 xdigits
|
- 或
(?:\.?[a-f0-9]{2}){5})
- 可选(1 或 9)点(\.?
)和 2 个 xdigits 的 5 个序列。
\b
- 尾随单词边界
import re
p = re.compile(r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:[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']
我想从可以不同格式显示的日志文件中提取特定的 Mac 地址。
例如,在这三行中:
6 月 16 日 10:24:28 (2248) 登录成功:cli 88-c9-d0-fd-13-65 通过 TLS 隧道)
6 月 16 日 10:24:35 (2258) 登录成功:cli f8:a9:d0:72:0a:dd 通过 TLS 隧道)
6 月 16 日 10:24:44 (2273) 登录成功:cli 485a.3f12.a35a 通过 TLS 隧道)
使用这个正则表达式:
([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}
我可以带出所有mac地址,在linux命令less.
内假设要搜索 48:5a:3f:12:a3:5a,我如何在 [=48] 中对特定 mac 地址应用相同的语法=]?
我试着写这样的东西:
regex = re.compile(r'([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}')
for line in file:
match = regex.search(line)
但显然不行
您可以使用
r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:[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}(?:[a-f0-9]{2}){4}
:([:-]?)
- 第 1 组捕获一个:
或-
的定界符
[a-f0-9]{2}
- 2 xdigits(?:[a-f0-9]{2}){4}
- 第 1 组中的 4 个定界符序列和 2 个 xdigits
|
- 或(?:\.?[a-f0-9]{2}){5})
- 可选(1 或 9)点(\.?
)和 2 个 xdigits 的 5 个序列。
\b
- 尾随单词边界
import re
p = re.compile(r'\b[a-f0-9]{2}(?:([:-]?)[a-f0-9]{2}(?:[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']