web-dev-qa-db-ja.com

シェルスクリプト-16進数のMACアドレスから1を引き、それにコロンを追加します

  1. 私は'C4:B9:83:7F:FF:AC'としてMACアドレスを持っていますそして

  2. C4B9837FFFACである16進値から1を減算して、C4B9837FFFABになるようにします。

  3. この後、C4:B9:83:7F:FF:ABのように、コロンを追加してコロンでフォーマットします。

私は最初の2つのステップの仕事をするいくつかの解決策を見つけました、

#!/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にするにはどうすればよいですか?

それを行う他の方法はありますか?

2
Straw Hat

sedの使用:

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

bashシェルスクリプト:

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

これにより、2つの16進文字の後に「:」が追加されます。

2
Max

bashsed、およびgforthを使用してコロンを削除し、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
1
agc

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
0
Steven Penny