shell脚本-从十六进制mac地址中减去1并添加冒号

shell脚本-从十六进制mac地址中减去1并添加冒号
  1. 我的 mac 地址为'C4:B9:83:7F:FF:AC'

  2. 我想从它的十六进制值中减去 1,这样C4B9837FFFAC它就会变成C4B9837FFFAB

  3. 之后我再次想添加冒号以使其按冒号格式化,例如C4:B9:83:7F:FF:AB

我找到了一些解决方案,可以完成前两个步骤,

#!/bin/sh
mac="C4:B9:83:7F:FF:AC"
machex=$( echo "$mac" | tr -d ':' ) # to remove colons
macdec=$( printf "%d\n" 0xC4B9837FFFAC ) # to convert to decimal
macdec1=$( expr $macdec - 1 ) # to subtract one 
machex1=$( printf "%x\n" $maclandec ) # to convert to hex again 
echo "$machex1" 

这将输出C4B9837FFFAB

我怎样才能添加冒号来实现它C4:B9:83:7F:FF:AB

还有其他方法吗?

答案1

使用sed

machex2=$(echo $machex1 | sed 's/\(..\)/\1:/g;s/:$//' )

答案2

巴什外壳脚本:

machex2=${machex1:0:2}:${machex1:2:2}:${machex1:4:2}:${machex1:6:2}:${machex1:8:2}:${machex1:10:2}

这将在两个十六进制字符后添加‘:’。

答案3

使用bash,sedgforth删除冒号,减去 1,然后恢复冒号:

mac="C4:B9:83:7F:FF:AC"
gforth -e 'hex '${mac//:}' 1 - . cr' -e bye | sed 's/../&:/g;s/:.$//'

输出:

C4:B9:83:7F:FF:AB

答案4

使用 POSIX Awk:

$ awk 'BEGIN{FS=OFS=":";$0=ARGV[1];$NF=sprintf("%X",("0x"$NF)-1);print}' C4:B9:83:7F:FF:AC
C4:B9:83:7F:FF:AB

相关内容