В Ubuntu с помощью команды ifconfig -a
я получаю всю информацию о моих интерфейсах ethernet / wifi.
Но мне нужно получить на выходе только MAC-адрес, например:
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
Как я могу получить это?
Самый легкий путь состоял бы в том, чтобы использовать grep
с PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.* -
grep -P
позволит нам использовать perl
, совместимый Regex
grep -o
только возьмет подобранную часть строки
-
, Мы соответствовали HWaddr
перед нашим желаемым соответствием (MAC-адреса) и затем отбрасываем HWaddr
\K
для печати только MAC-адресов.
@Helio упомянул важный момент, это очень зависит от Вашего языка т.е. locale
настройки. Для преодоления этого, можно использовать C
локаль (набор символов ASCII использования) для этой команды только:
$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*
74:d4:35:84:34:13
74:d4:35:84:34:13
grep -P
позволит нам использовать perl
, совместимый Regex
grep -o
только возьмет подобранную часть строки
, Мы соответствовали HWaddr
перед нашим желаемым соответствием (MAC-адреса) и затем отбрасываем HWaddr
\K
для печати только MAC-адресов.
@Helio упомянул важный момент, это очень зависит от Вашего языка т.е. locale
настройки. Для преодоления этого, можно использовать C
локаль (набор символов ASCII использования) для этой команды только:
$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*
74:d4:35:84:34:13
Можно получить доступ address
файл для каждого устройства на /sys
виртуальная файловая система. MAC-адрес должен быть в /sys/class/net/<device-name>/address
:
$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c
Для всех устройств:
$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
Вот несколько путей:
grep
. Существуют различные регулярные выражения, которые возьмут их. Здесь, я ищу 5 повторений 2 букв или чисел, сопровождаемых двоеточием, затем любые два символа. -i
делает соответствие нечувствительным к регистру и -o
делает grep
распечатайте только подобранную часть. -E
включает расширенные регулярные выражения. Тот же regex также работает с PCREs (-P
).
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed
. -n
подавляет нормальный вывод и -r
включает расширенные регулярные выражения. Используя тот же regex как выше, этот сценарий попытается заменить все на строке с частью его, которая соответствует regex. Если замена была успешна, получающаяся строка печатается (из-за p
в конце замены).
ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
awk
. Если строка запускается со словесного символа ([a-zA-Z0-9_]
), и имеет 5 полей, распечатайте последний.
ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
Perl, где как обычно, существует больше чем один способ сделать это. Этот - та же логика как awk
выше. -a
говорит жемчугу разделять каждую входную строку на @F
массив.
ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
С другой стороны, можно использовать regex от предыдущих подходов:
ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
Coreutils.
LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
ifconfig -a | grep HWaddr | awk '{print $5}'
, Если Ваш системный вывод является неанглийским в этой команде, то имеет смысл выполнять его этот путь.
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
Это применимо ко всем решениям.
Поскольку некоторые прокомментировали, ifconfig
удерживается от использования в пользу ip
команда. Так комбинируя различные решения и комментарии, я использовал бы:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF