Виведіть лише 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

Як я можу це отримати?

Відповіді:


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  

2
Ви можете використовувати LANG=C ifconfig -aзамість ifconfig -aне-англійських установок, це можуть бути проблеми з grep. (тобто в моїй системі HWaddrє direcciónHW)
Геліо,

@Helio, що якщо ввести ifconfig -a | grep -i hw-*:?
JoKeR

1
@JoKeR просто цікаво - це -*повинно щось означати?
муру

@muru насправді я не переплутав себе, я подумав, що він не знайде, HWале він заявив на HWaddrіспанській direcciónHWHW
мові,

Регекс 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

@hobbs Зачекайте, який це інструмент?
detly

@detly ifconfig
hobbs

1
@hobbs Woah. Я цього не знав. Він не друкує попередження про депресію на моїй машині.
detly

1
@detly Ifconfig була оголошена застарілі року тепер, і ipтакож була навколо в протягом багатьох років.
муру

11

Ось декілька способів:

  1. grep. Існують різні регулярні вирази, які підберуть їх. Тут я шукаю 5 повторень з 2 букв чи цифр з наступною двокрапкою, а потім будь-якими двома символами. -iРобить матч нечутливі до регістру і -oмарки grepдрукувати тільки збігається частина. -Eдозволяє розширити регулярні вирази. Цей же регекс працює і з PCRE ( -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. Coreutils.

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

6

Як коментують деякі, ifconfigзастаріла на користь ipкоманди. Таким чином, поєднуючи різні рішення та коментарі, я б використав:

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

4

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

Якщо в цій команді ваш системний вихід не є англійською, то має сенс запустити його таким чином.

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

Це стосується всіх рішень.


5
Замість використання grepокремо ви можете фільтрувати з awkтаким чином: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt

Так, дійсно багато способів зробити це.
Пілот6

2
Ви можете використовувати LANG=C ifconfig -aзамість ifconfig -aне-англійських установок, це можуть бути проблеми з grep. (тобто в моїй системі HWaddrє direcciónHW)
Геліо,

Гарне повідомлення. Але в моїй російській установці це все-таки HWaddr.
Пілот6

Ваша російська установка може бути, але моя іспанська інсталяція ні. ;-) Це може бути величезна проблема. Будь ласка, поставте @Helioна початку коментар. Якщо ні, я не отримаю сповіщення.
Геліо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.