Выводите только MAC-адрес в Ubuntu

В Ubuntu с помощью команды ifconfig -a, я получаю всю информацию о моих интерфейсах ethernet / wifi.

Но мне нужно получить в качестве выходных данных только MAC-адрес, например:

ab:cd:ef:12:34:5657:89:12:34:ac:2312:34:56:ab:cd:ef

Как я могу это получить?

Вы можете получить доступ к address файл для каждого устройства на /sys виртуальная файловая система. MAC-адрес должен быть в /sys/class/net/<device-name>/address:

$ cat /sys/class/net/enp1s0/address34:17:eb:5d:88:7c

Для всех устройств:

$ cat /sys/class/net/*/address34:17:eb:5d:88:7c00:00:00:00:00:0064:5a:04:69:50:45

Самым простым способом было бы использовать 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  

Вот несколько способов:

  1. grep. Существуют различные регулярные выражения, которые будут их улавливать. Здесь я ищу 5 повторений из 2 букв или цифр, за которыми следует двоеточие, а затем любые два символа. То -i делает совпадение нечувствительным к регистру, а -o делает grep печатайте только соответствующую часть. -E включает расширенные регулярные выражения. То же самое регулярное выражение также работает с PCREs (-P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
  2. sed. В -n подавляет нормальный выход и -r включает расширенные регулярные выражения. Используя то же регулярное выражение, что и выше, этот скрипт попытается заменить все в строке той ее частью, которая соответствует регулярному выражению. Если замена прошла успешно, печатается результирующая строка (из-за p в конце замены).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
  3. awk. Если строка начинается с символа слова ([a-zA-Z0-9_]), и имеет 5 полей, выведите последнее.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
  4. 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'
  5. Основные средства.

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5

Как некоторые прокомментировали, ifconfig является устаревшим в пользу ip команда. Поэтому, объединив различные решения и комментарии, я бы использовал:

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'FF:FF:FF:FF:FF:FF

ifconfig -a | grep HWaddr | awk '{print $5}'

Если ваш системный вывод в этой команде не на английском языке, то имеет смысл запустить его таким образом.

LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'

Это применимо ко всем решениям.