使用 grep 通过 MacOs ifconfig 只有接口名称和 MAC 地址

Using grep to have only interface name and MAC address over MacOs ifconfig

我正在使用 MacOS 并对其进行管理,我只想通过使用 grep 列表来获取

接口名称和地址

lo0 ether 00:00:00:00:00:00 
gif0 ether 00:00:00:00:00:00 
stf0 ether 00:00:00:00:00:00 
en0 ether 00:00:00:00:00:00 
en5 ether 00:00:00:00:00:00 
en1 ether 00:00:00:00:00:00 
en2 ether 00:00:00:00:00:00 
en3 ether 00:00:00:00:00:00 
en4 ether 00:00:00:00:00:00 
utun0 ether 00:00:00:00:00:00

我试过,我试过一些我写的命令,我能做的最好的是:

ifconfig | echo `grep -oE '^[a-zA-Z]{1,4}[0-9]{1,4}'`

output:

lo0 gif0 stf0 en0 en5 en1 en2 en3 en4 utun0

有人对我有更充分的准备吗?

这可能会让你们更接近:

grep -o '\b[0-9a-z:]*[0-9]\b' 

但是输出中有新行:

lo0
00:00:00:00:00:00
gif0
00:00:00:00:00:00
stf0
00:00:00:00:00:00
en0
00:00:00:00:00:00
en5
00:00:00:00:00:00
en1
00:00:00:00:00:00
en2
00:00:00:00:00:00
en3
00:00:00:00:00:00
en4
00:00:00:00:00:00
utun0
00:00:00:00:00:00

但是,如果您允许使用 xargs,您可以获得一个将您的界面和 mac 放在同一行的解决方案:

grep -o '\b[0-9a-z:]*[0-9]\b'  | xargs -L2
lo0 00:00:00:00:00:00
gif0 00:00:00:00:00:00
stf0 00:00:00:00:00:00
en0 00:00:00:00:00:00
en5 00:00:00:00:00:00
en1 00:00:00:00:00:00
en2 00:00:00:00:00:00
en3 00:00:00:00:00:00
en4 00:00:00:00:00:00
utun0 00:00:00:00:00:00

grep 正在查找包含数字的字符串。因此,ether 从匹配字符串中省略。当然,这不是一个很通用的解决方案。

当然,如果你想使用 shell 替换回抽动(或更好的 $()):

 ifconfig | echo $( grep -o '\b[0-9a-z:]*[0-9]\b'  )

读取 ifconfig 输出的简单 Perl 脚本将起作用。我们将实例名称 ($inst) 定义为一行开始并以冒号和一个或多个空格结束的字符。满足此条件的匹配项将被保存并继续读取循环。当一行以一个或多个空格开头并且遇到标记 ether 时,我们打印实例名称和刚刚读取的行。

ifconfig|perl -ne 'if (m/^(.+):\s+/) {$inst=};if (m{^\s+ether}) {print $inst,$_}'
en0     ether 34:15:9e:23:7b:78 
en1     ether 7c:6d:62:73:ff:4e 
p2p0    ether 0e:6d:62:73:ff:4e 

如果坚持 grep-only 解析,这将产生粗略的提取,然后可以进一步处理:

ifconfig|grep -Eo '^[0-9a-z]+:|ether.+'|grep -B1 -Eo 'ether.+'|grep -v -- "--"|paste - -

en0:    ether 34:15:9e:23:7b:78 
en1:    ether 7c:6d:62:73:ff:4e 
p2p0:   ether 0e:6d:62:73:ff:4e