En mi trabajo es habitual trabajar con numeros en hexadecimal, en concreto con direcciones MAC. Ciertas operaciones requieren sumar o restar en hexadecimal y a veces puede suponer un problema. Además, según de donde vengan los datos, las macs pueden venir con guiones, dos puntos o sin separar.

Como es algo que hago de forma más o menos habitual, me lo dejo por aquí apuntado por si a alguien más le sirve

Script para realizar operaciones con direcciones MAC en hexadecimal

Explicacion Previa

  • Partiremos de un archivo en el que tenemos las macs. Pueden venir sin separar, separadas con guiones o con dos puntos.
  • Una de las variables, $OPERACION define la operacion de sumar o restar para las direcciones MAC.
  • El script saca un archivo de destino con las macs procesadas, con el mismo nombre del archivo de origen añadiéndole la fecha.
#!/bin/sh

ORIGENMACS="./sourcefile" # CAMBIAR
TEMPMACS="./macs-temp"
OPERACION="+1"
DESTINOMACS=$ORIGENMACS"-procesadas-`date +%Y%m%d`"

# Limpieza inicial

rm -f $TEMPMACS $DESTINOMACS

# Eliminamos guiones y dos puntos de las macs, si viniesen. Pasamos a mayusculas la MAC
sed -e 's/[:-]//g' $ORIGENMACS | tr [[:lower:]] [[:upper:]] > $TEMPMACS

for linea in $(cat $TEMPMACS); do 
MACTRANSFORMADA=`echo "obase=16;ibase=16;$linea$OPERACION"|bc`
# Comprobamos si a la mac le faltan ceros delante
if [ ${#MACTRANSFORMADA} -lt 12 ]; then
# Por algun motivo, printf parece no querer rellenar con ceros cuando se trata de un string asi que le hacemos trampa
printf '%012sn' $MACTRANSFORMADA |sed -e 's/ /0/g' |sed -e 's/[0-9A-F]{2}/&-/g' -e 's/-$//' >> $DESTINOMACS
else
echo $MACTRANSFORMADA |sed -e 's/[0-9A-F]{2}/&-/g' -e 's/-$//' >> $DESTINOMACS
fi
done
rm $TEMPMACS

Uno de los aspectos que contempla este script es que las macs originales incluyan ceros al principio, ya que bc se lo lleva por delante al hacer la operación. Una vez termina la operación, el script se encarga de rellenar con ceros los dígitos de la mac que faltan. También entrega las macs definitivas en mayúsculas y separadas por guiones. Si queremos entregarlas separadas por otro caracter, hay que cambiar los seds de dentro del IF.