BASH Инкремент MAC-адрес - PullRequest
       8

BASH Инкремент MAC-адрес

1 голос
/ 20 июня 2019

У меня есть действительный mac-адрес в переменной с именем oldMAC Мне нужно увеличить это значение, а затем вернуть новый действительный MAC-адрес.

В этом примере я увеличиваю на 1, но этоможет быть любым значением.

Пока у меня есть следующее:

echo $oldMAC
mac=$(echo $oldMAC |  tr '[:lower:]' '[:upper:]' | tr -d ':') # upper case and remove :
echo $mac

macdec=$( printf '%d\n' 0x$mac ) # convert to decimal
echo $macdec

macadd=$( expr $macdec + 1 ) # add 1
echo $macadd

machex=$( printf '%X\n' $macadd ) # convert to hex
echo $machex

Это выводит:

00:12:34:ae:BC:EF (oldMAC)
001234AEBCEF (mac)
78193278191 (macdec)
78193278192 (madadd)
1234AEBCF0 (machex)

У меня проблема в том, как решитьконвертировать 1234AEBCF0, чтобы он возвращался как 00:12:34:AE:BC:F0

Кто-нибудь может посоветовать, как это сделать ... или есть лучший способ?

Спасибо

1 Ответ

2 голосов
/ 20 июня 2019

sed для спасения:

macnew=$(echo $machex | sed 's/../&:/g;s/:$//')

Узор

+------------ substitute
|  +--------- any two characters
|  | +------- with the whole match
|  | |+------ and :
|  | || +---- all occurrences, utilizing the fact it means non-overlapping
|  | || |+------- another command
|  | || ||+------ substitute
|  | || ||  +---- :
|  | || ||  |+--- at the end of line
|  | || ||  || +- with nothing to get rid of the trailing :
V  V VV VV  VV V
s/../&:/g;s/:$//

Вы также должны убедиться, что на самом деле напечатаны 12 цифр. Команда printf может сделать это, просто сделайте шаблон "%012x" - 0 означает pad с 0 s (вместо пробелов) и 12 - минимальная ширина. Используйте прописные буквы X для прописных шестнадцатеричных цифр и строчные буквы x для строчных шестнадцатеричных цифр.


Вы можете немного упростить сложение, используя встроенное арифметическое расширение bash, которое непосредственно понимает шестнадцатеричный вывод и понимает как верхний, так и нижний регистр, поэтому вам нужно только отбросить : s:

mac=$(echo $oldMAC | tr -d ':')
macadd=$(( 0x$mac + 1 ))

Он все еще возвращается как десятичное число, поэтому вам все еще нужен printf "% 012x" для его преобразования. Вы можете направить его прямо в седьку, чтобы она была короткой.

macnew=$(printf "%012x" $macadd | sed 's/../&:/g;s/:$//')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...