regex ifconfig输出的正则表达式

inkz8wg9  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(126)

我试图创建一个正则表达式模式来匹配设备名,接口的ip地址和mac地址。
我有这三场比赛:

device name = r'([^\s]+):\s'
mac address = r'ether (\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)' 
ipv4 = r'inet\s+([^\s]+)'

这是ifconfig的输出

eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 111.111.111.111  netmask 255.255.255.0  broadcast 111.111.111.111
        ether 1a:2b:3c:4d:5e:6f  txqueuelen 1000  (Ethernet)
        RX packets 149694  bytes 162604639 (155.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 98703  bytes 13286845 (12.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 38  bytes 3424 (3.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 3424 (3.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我试过在两者之间使用.*?,但没有成功。我知道环回设备没有mac,所以想知道是否可以用mac做一个不。或者只有两个模式,如果它不能找到所有三个,使用第二个模式来找到设备名和ip地址。如果你也能提供一个python 3的实现,那将非常有帮助。

hc8w905p

hc8w905p1#

您可以使用

(.+?): flags

的IP地址

((?:\d+\.){3}\d+)

如果只需要 “inet” 条目,请使用

inet ((?:\d+\.){3}\d+)

MAC地址

(?i)((?:[a-f\d]+:){5}[a-f\d]+)

输出量

eno2
111.111.111.111
255.255.255.0
111.111.111.111
1a:2b:3c:4d:5e:6f
lo
127.0.0.1
255.0.0.0
jmp7cifd

jmp7cifd2#

这是一种非常复杂的获取设备名称、私有ip地址和当前网络接口的mac地址的方法。
而不是这个使用特定的方式来实现你的输出.
对于设备名称,您可以使用此python脚本:

import socket

hostname = socket.gethostname()

对于私有IP地址,使用这个简单的Python脚本:

import socket
import os

hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)

要获取当前网络接口的MAC地址,您可以使用以下简单的Python脚本:

from uuid import getnode as get_mac

mac = get_mac()

我希望它有帮助!:)

vyu0f0g1

vyu0f0g13#

您可以尝试按\n\n将文本拆分为单独的组,然后单独搜索信息:

import re

text = '''\
eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 111.111.111.111  netmask 255.255.255.0  broadcast 111.111.111.111
        ether 1a:2b:3c:4d:5e:6f  txqueuelen 1000  (Ethernet)
        RX packets 149694  bytes 162604639 (155.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 98703  bytes 13286845 (12.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 38  bytes 3424 (3.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 3424 (3.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0'''

pat_name = re.compile(r'^(\S+):', flags=re.M)
pat_mac = re.compile(r'^\s*ether (\S+)', flags=re.M)
pat_ipv4 = re.compile(r'^\s*inet\s*(\S+)', flags=re.M)

for group in text.split('\n\n'):
    name = pat_name.search(group)
    mac = pat_mac.search(group)
    ipv4 = pat_ipv4.search(group)

    name = name.group(1) if name else None
    mac = mac.group(1) if mac else None
    ipv4 = ipv4.group(1) if ipv4 else None

    print(f'{name=} {mac=} {ipv4=}')

图纸:

name='eno2' mac='1a:2b:3c:4d:5e:6f' ipv4='111.111.111.111'
name='lo' mac=None ipv4='127.0.0.1'

相关问题