BASH递增MAC地址

时间:2019-06-20 12:35:52

标签: bash macos hex decimal

我在名为oldMAC的变量中有一个有效的mac地址。 我需要增加它,然后返回一个新的有效MAC地址。

在此示例中,我将增加1,但是可以增加任意值。

到目前为止,我有以下内容:

echo $oldMAC
mac=$(echo $oldMAC |  tr '[:lower:]' '[:upper:]' | tr -d ':') # upper case and remove :
echo $mac

macdec=$( printf '%d\n' 0x$mac ) # convert to decimal
echo $macdec

macadd=$( expr $macdec + 1 ) # add 1
echo $macadd

machex=$( printf '%X\n' $macadd ) # convert to hex
echo $machex

这将输出:

00:12:34:ae:BC:EF (oldMAC)
001234AEBCEF (mac)
78193278191 (macdec)
78193278192 (madadd)
1234AEBCF0 (machex)

我遇到的问题是如何转换1234AEBCF0,使其返回为00:12:34:AE:BC:F0

任何人都可以建议如何做...还是有更好的方法?

谢谢

2 个答案:

答案 0 :(得分:2)

sed进行营救:

macnew=$(echo $machex | sed 's/../&:/g;s/:$//')

模式是

+------------ substitute
|  +--------- any two characters
|  | +------- with the whole match
|  | |+------ and :
|  | || +---- all occurrences, utilizing the fact it means non-overlapping
|  | || |+------- another command
|  | || ||+------ substitute
|  | || ||  +---- :
|  | || ||  |+--- at the end of line
|  | || ||  || +- with nothing to get rid of the trailing :
V  V VV VV  VV V
s/../&:/g;s/:$//

您还需要确保实际打印了12位数字。 printf命令可以做到这一点,只需将模式"%012x"-0设置为填充0(而不是空格),并且12是最小宽度。大写的十六进制数字使用大写X,小写的十六进制数字使用小写x


您可以使用bash的内置算术扩展来简化加法运算,该扩展直接了解十六进制输出,并了解大小写,因此只需要删除:

mac=$(echo $oldMAC | tr -d ':')
macadd=$(( 0x$mac + 1 ))

它仍然以十进制形式返回,因此您仍然需要printf“%012x”进行转换。您可以将其直接传递到sed,以使其简短。

macnew=$(printf "%012x" $macadd | sed 's/../&:/g;s/:$//')

答案 1 :(得分:0)

只需更改2行。

  

mac = $(echo $ oldMAC | tr'[:lower:]''[:upper:]'| tr -d':')

 mac=$(echo $oldMAC | sed s/":"//g)

然后

  

machex = $(printf'%X \ n'$ macadd)

machex=$( printf '%X\n' $macadd |tee|tr A-Z a-z)

整体

mac=$(echo $oldMAC|sed s/":"//g)
macdec=$(printf '%d\n' 0x$oldmac)
macadd=$(expr $macdec + 1)
machex=$( printf '%X\n' $macadd |tee|tr A-Z a-z)