我在名为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
任何人都可以建议如何做...还是有更好的方法?
谢谢
答案 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)