运行时以下代码行做了什么?
ifconfig|grep HWaddr | head -1 | tr -s ' ' | cut -f 5 -d' '| tr -d ':'
答案 0 :(得分:2)
它执行以下操作:
ifconfig
)grep Hwaddr
)head -1
)tr -s ' '
)cut -f 5 -d' '
):
(tr -d ':'
)。剩余的是机器中第一个网络接口的mac地址。
答案 1 :(得分:1)
它返回没有冒号的MAC地址。
我希望你熟悉管道,让它分开。前三个命令:
ifconfig | grep HWaddr | head -1
ifconfig
是一个显示有关网络接口信息的程序。您将其提供给grep
。 grep
查找HWaddr
模式:换句话说,它将过滤ifconfig
的输出,以便仅保留包含字符串HWaddr
的行。现在您将输出提供给head -1
,这意味着您只对第一场比赛感兴趣。可能的输出是:
eth0 Link encap:Ethernet HWaddr 01:23:45:67:89:ab
现在使用tr
删除字符:由于无法预测接口名称(eth0
)等,因此您不知道eth0
和{之间的空间大小。 {1}}。为了使这个具有决定性,你使用Link encap...
,因此tr
命令之后的输出是:
tr -s ' '
现在我们只对硬件地址的一部分感兴趣:因为我们知道eth0 Link encap:Ethernet HWaddr 01:23:45:67:89:ab
之前有四个元素,我们可以HWaddr
离开它们:
cut
我们使用eth0 Link encap:Ethernet HWaddr 01:23:45:67:89:ab
#^1 ^2 ^3 ^4 ^5
执行此操作,其中cut -f 5 -d' '
是分隔符,我们对第五个字段感兴趣。最后,我们再次使用-d
删除冒号。
这个命令在做出很多假设的意义上并不是真正的智能。如果后来有人决定稍微改变tr -d ':'
的输出,这可能会有问题。在性能方面以及在做出假设时的改进如下:
ifconfig
首先再次打印ifconfig | grep 'HWaddr.*' -o -m 1 | grep -P -o '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}' | tr -d ':'
,过滤掉ifconfig
的行并打印第一个匹配行的剩余部分。然后,它使用正则表达式HWaddr
搜索MAC地址的模式,最后再次删除冒号(([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}
)。
虽然命令看起来更长,但它只使用四个进程(对于六个原始进程),因此使用三个进程。此外,还使用了一种模式,因此如果后来人们改变了对如何格式化:
输出的想法,那么脚本仍然可能会正确识别MAC地址。