Вы можете получить доступ к address файл для каждого устройства на /sys виртуальная файловая система. MAC-адрес должен быть в /sys/class/net/<device-name>/address:
Самым простым способом было бы использовать grep с помощью PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.*$'74:d4:35:84:34:13
grep -P позволит нам использовать perl совместимое регулярное выражение
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
grep. Существуют различные регулярные выражения, которые будут их улавливать. Здесь я ищу 5 повторений из 2 букв или цифр, за которыми следует двоеточие, а затем любые два символа. То -i делает совпадение нечувствительным к регистру, а -o делает grep печатайте только соответствующую часть. -E включает расширенные регулярные выражения. То же самое регулярное выражение также работает с PCREs (-P).
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed. В -n подавляет нормальный выход и -r включает расширенные регулярные выражения. Используя то же регулярное выражение, что и выше, этот скрипт попытается заменить все в строке той ее частью, которая соответствует регулярному выражению. Если замена прошла успешно, печатается результирующая строка (из-за 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 сообщает perl разделить каждую входную строку на @F массив.
ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
В качестве альтернативы вы можете использовать регулярное выражение из предыдущих подходов:
ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
Как некоторые прокомментировали, ifconfig является устаревшим в пользу ip команда. Поэтому, объединив различные решения и комментарии, я бы использовал:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'FF:FF:FF:FF:FF:FF