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

36

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

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

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

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

simone_s1994
источник

Ответы:

41

Самый простой способ - использовать grepс PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
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  
heemayl
источник
2
Вы можете использовать LANG=C ifconfig -aвместо ifconfig -aнеанглоязычных установок, могут быть проблемы с grep. (т.е. в моей системе HWaddrесть direcciónHW)
Helio
@Helio что если вы напечатаете: ifconfig -a | grep -i hw-*?
JoKeR
1
@JoKeR просто любопытно - это -*должно что-то значить?
Муру
@muru не совсем я запутался, я думал, что он не может найти, HWно он заявил HWaddrи говорит по- испански, как я думаю / вижу, direcciónHWтак что это просто HWможно;)
JoKeR
Perl регулярное выражение в grep"очень экспериментально". Если вы хотите использовать основное регулярное выражение, эквивалентная команда , ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'или, если вы предпочитаете, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. Я пропустил трейлинг, $потому что вывод содержит пробелы после MAC-адреса, и, вероятно, вы не хотите их.
Пэдди Ландау
67

Вы можете получить доступ к 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
Мур
источник
6
+1 за то, что не использовал инструмент, который не рекомендуется в течение десятилетия :)
Хоббс
@hobbs Подождите, какой инструмент это?
детально
@ детально ifconfig
хоббс
1
@hobbs Вау. Я не знал об этом. На моей машине не выводится предупреждение об устаревании.
детально
1
@ детально ifconfig устарела в течение многих лет , а ipтакже существует уже много лет.
Муру
11

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

  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, Если строка начинается со слова character ( [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. Coreutils.

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    
terdon
источник
6

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

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
user352726
источник
4

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

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

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

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

Pilot6
источник
5
Вместо того, чтобы использовать grepотдельно, вы можете отфильтровать awkпрямо так: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt
Да, есть действительно много способов сделать это.
Pilot6
2
Вы можете использовать LANG=C ifconfig -aвместо ifconfig -aнеанглоязычных установок, могут быть проблемы с grep. (т.е. в моей системе HWaddrесть direcciónHW)
Helio
Хорошее уведомление Но в моей русской установке это все-таки HWaddr.
Pilot6
Ваша русская установка может быть, но моя испанская установка - нет. ;-) Это может быть огромной проблемой. Пожалуйста, поставьте @Helioв начале комментария. Если нет, я не буду уведомлен.
Гелио