Saída somente endereço MAC no Ubuntu

15

No Ubuntu, com o comando ifconfig -a , obtenho todas as informações sobre minhas interfaces ethernet / wifi.

Mas eu preciso obter como saída somente o endereço MAC, como:

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

Como posso obter isso?

    
por simone_s1994 26.05.2015 / 12:43

5 respostas

24

A maneira mais fácil seria usar grep com o PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -P nos permitirá usar o perl compatível Regex

  • grep -o terá apenas a parte correspondente da linha

  • Reunimos HWaddr antes de nossa correspondência desejada (endereços MAC) e, em seguida, descartamos HWaddr por \K para imprimir somente os endereços MAC.

@Helio mencionou um ponto importante, isso depende muito do seu idioma, por exemplo, locale configurações. Para superar isso, você pode usar o C locale (usa o conjunto de caracteres ASCII) somente para este comando:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
    
por heemayl 26.05.2015 / 12:50
28

Você pode acessar o arquivo address para cada dispositivo no sistema de arquivos /sys virtual. O endereço MAC deve estar em /sys/class/net/<device-name>/address :

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

Para todos os dispositivos:

$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
    
por muru 26.05.2015 / 14:55
9

Aqui estão algumas maneiras:

  1. grep . Existem várias expressões regulares que irão buscá-las. Aqui, estou procurando 5 repetições de 2 letras ou números seguidos de dois pontos e, em seguida, quaisquer dois caracteres. O -i torna o caso de correspondência insensível e o -o faz com que grep imprima apenas a parte correspondente. -E ativa expressões regulares estendidas. O mesmo regex também funciona com PCREs ( -P ).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed . O -n suprime a saída normal e o -r ativa expressões regulares estendidas. Usando o mesmo regex acima, esse script tentará substituir tudo na linha pela parte correspondente à regex. Se a substituição foi bem sucedida, a linha resultante é impressa (por causa do p no final da substituição).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*//p'
    
  3. awk . Se a linha começar com um caractere de palavra ( [a-zA-Z0-9_] ) e tiver 5 campos, imprima o último.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, onde, como sempre, há mais de uma maneira de fazer isso. Essa é a mesma lógica que o awk acima. O -a diz ao perl para dividir cada linha de entrada na matriz @F .

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

    Como alternativa, você pode usar o regex das abordagens anteriores:

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

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    
por terdon 26.05.2015 / 15:33
5

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

Se a saída do seu sistema não estiver em inglês neste comando, faça sentido executá-lo desta forma.

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

Isso é aplicável a todas as soluções.

    
por Pilot6 26.05.2015 / 12:48
2

Como alguns comentaram, ifconfig está obsoleto em favor do comando ip . Então, combinando as várias soluções e comentários, eu usaria:

$ LANG=C ip link show | awk '/link\/ether/ {print }'
FF:FF:FF:FF:FF:FF
    
por user352726 08.03.2018 / 18:52