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.