Saída apenas de endereço MAC no Ubuntu

36

No Ubuntu, com comando ifconfig -a, obtenho todas as informações sobre minhas interfaces Ethernet / Wi-Fi.

Mas eu preciso obter como saída apenas 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?

simone_s1994
fonte

Respostas:

40

A maneira mais fácil seria usar grepcom o PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pnos permitirá usar perlRegex compatível

  • grep -o só pegará a parte correspondente da linha

  • Temos acompanhado HWaddrantes de o nosso jogo desejado (endereços MAC) e, em seguida, descartar HWaddrpor \Kimprimir apenas os endereços MAC.

O @Helio mencionou um ponto importante, isso depende muito do seu idioma, ou seja, das localeconfigurações. Para superar isso, você pode usar o Ccódigo do idioma (usa o conjunto de caracteres ASCII) apenas para este comando:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
heemail
fonte
2
Você pode usar, em LANG=C ifconfig -avez de ifconfig -apara instalações que não sejam o inglês, pode haver problemas com o grep. (ie No meu sistema, HWaddré direcciónHW)
Helio
@ Helio e se você digitar ifconfig -a | grep -i hw-*:?
JoKeR
1
@JoKeR apenas curioso - isso -*deveria significar alguma coisa?
2600 muru
@muru realmente não me confundido Eu pensei que ele coud não encontrar HW, mas ele afirmou em HWaddre espanhol como eu acho que / ver direcciónHWpor isso é simplesmente apenas HWpode ser;)
JoKeR
Regex Perl em grep"é altamente experimental". Se você deseja usar regex básico, o comando equivalente é ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'ou, se preferir ifconfig -a | grep -o 'HWaddr [a-f0-9:]*',. Omiti o final $porque a saída inclui espaços após o endereço MAC e provavelmente você não os deseja.
Paddy Landau
67

Você pode acessar o addressarquivo para cada dispositivo no /syssistema de arquivos 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
muru
fonte
6
+1 para não usar uma ferramenta que tem sido preterido por uma década :)
hobbs
Espere, que ferramenta é essa?
detly 26/05
@detly ifconfig
hobbs
1
@hobbs Woah. Eu não estava ciente disso. Ele não imprime o aviso de descontinuação na minha máquina.
detly
1
@detly ifconfig está obsoleto há anos e iptambém existe há anos.
Muru
11

Aqui estão algumas maneiras:

  1. grep. Existem várias expressões regulares que as buscarão. Aqui, estou procurando 5 repetições de 2 letras ou números seguidos por dois pontos, depois dois caracteres. Isso -itorna a correspondência entre maiúsculas e minúsculas e -otorna grepapenas a parte correspondente. -Epermite 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 -nsuprime a saída normal eo -rpermite expressões comuns prolongados. Usando o mesmo regex acima, esse script tentará substituir tudo na linha pela parte correspondente ao regex. Se a substituição foi bem-sucedida, a linha resultante é impressa (devido ao pno final da substituição).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/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 a awkanterior. O -acomando diz ao perl para dividir cada linha de entrada na @Fmatriz.

    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 $1'
    
  5. Coreutils.

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

Como alguns comentaram, ifconfigé preterido em favor do ipcomando. Então, combinando as várias soluções e comentários, eu usaria:

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

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

Se a saída do sistema não estiver em inglês nesse comando, faz sentido executá-lo dessa maneira.

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

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

Pilot6
fonte
5
Em vez de usar grepseparadamente, você pode filtrar awkdiretamente como este: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt
Sim, existem várias maneiras de fazer isso.
Pilot6
2
Você pode usar, em LANG=C ifconfig -avez de ifconfig -apara instalações que não sejam o inglês, pode haver problemas com o grep. (ou seja, no meu sistema, HWaddré direcciónHW)
Helio
Bom aviso. Mas na minha instalação russa ainda é o HWaddr.
Pilot6
Sua instalação em russo pode ser, mas minha instalação em espanhol não. ;-) Pode ser um grande problema. Por favor, coloque @Heliono início do comentário. Caso contrário, não serei notificado.
Helio