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

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

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

ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef

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

35
задан 26 May 2015 в 17:37

5 ответов

Самый легкий путь состоял бы в том, чтобы использовать 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  
0
ответ дан 26 May 2015 в 17:37

Можно получить доступ 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
0
ответ дан 26 May 2015 в 17:37

Вот несколько путей:

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

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

    ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
    

    С другой стороны, можно использовать regex от предыдущих подходов:

    ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
    
  5. Coreutils.

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    
11
ответ дан 26 May 2015 в 17:37

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

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

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

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

0
ответ дан 26 May 2015 в 17:37

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

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
5
ответ дан 23 November 2019 в 00:22

Другие вопросы по тегам:

Похожие вопросы: