Вам не нужно xxd
или hexdump
.urandom
также будет генерировать числа, которые соответствуют кодировкам цифр и букв, используемых для представления шестнадцатеричных чисел, поэтому вы можете просто использовать
old="${mac:10:1}"
different_mac_digit=$(tr -dc 0-9A-F < /dev/urandom | tr -d "$old" | head -c1)
Конечно, вы можете заменить весь ваш скрипт на awk
сценарий тоже.Следующий скрипт GNU awk
заменит 11-й символ каждой строки случайным шестнадцатеричным символом, отличным от старого.С <<< macaddress
мы можем подать macaddress
на его стандартный ввод, не используя echo
или что-то в этом роде.
awk 'BEGIN { srand(); pos=11 } {
old=strtonum("0x" substr($0,pos,1))
new=(old + 1 + int(rand()*15)) % 16
print substr($0,1,pos-1) sprintf("%X",new) substr($0,pos+1)
}' <<< 00:00:00:00:00:00
Хитрость заключается в добавлении случайного числа от 1 до 15 (оба включительно).) к цифре, подлежащей изменению.Если мы получим число больше 15, мы обернемся, используя оператор по модулю %
(16
становится 0
, 17
становится 1
и т. Д.).Таким образом, результирующая цифра гарантированно будет отличаться от старой.
Тем не менее, тот же подход будет короче, если будет полностью написан на bash.
mac="00:00:00:00:00:00"
old="${mac:10:1}"
(( new=(16#"$old" + 1 + RANDOM % 15) % 16 ))
printf %s%X%s\\n "${mac::10}" "$new" "${mac:11}"
«Однострочная» версия:
mac=00:00:00:00:00:00
printf %s%X%s\\n "${mac::10}" "$(((16#${mac:10:1}+1+RANDOM%15)%16))" "${mac:11}"