这个代码行在linux中做了什么,最后我有点困惑

时间:2016-01-10 13:35:52

标签: linux bash ifconfig

运行时以下代码行做了什么?

ifconfig|grep HWaddr | head -1 | tr -s ' ' | cut -f 5 -d' '| tr -d ':'

2 个答案:

答案 0 :(得分:2)

它执行以下操作:

  • 打印出可用的网络接口(ifconfig
  • 过滤掉包含其mac地址(grep Hwaddr
  • 的行
  • 将输出限制为仅第一行(head -1
  • 在此单行中,使用单个空格(tr -s ' '
  • 替换多个空格
  • 过滤掉第五个字段,而字段则以空格(cut -f 5 -d' '
  • 分隔
  • 最后删除输出中的:tr -d ':')。

剩余的是机器中第一个网络接口的mac地址。

答案 1 :(得分:1)

简而言之......

它返回没有冒号的MAC地址。

解释

我希望你熟悉管道,让它分开。前三个命令:

ifconfig | grep HWaddr | head -1

ifconfig是一个显示有关网络接口信息的程序。您将其提供给grepgrep查找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地址。