Salida solo dirección MAC en Ubuntu

36

En Ubuntu, con el comando ifconfig -a, obtengo toda la información sobre mis interfaces ethernet / wifi.

Pero necesito obtener como salida solo la dirección MAC, como:

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

¿Cómo puedo obtener esto?

simone_s1994
fuente

Respuestas:

41

La forma más fácil sería usar grepcon PCRE:

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

  • grep -o solo tomará la parte coincidente de la línea

  • Hemos emparejado HWaddrantes de que nuestros partidos deseada (direcciones MAC) y después se deseche HWaddrpor \Kimprimir sólo las direcciones MAC.

@Helio ha mencionado un punto importante, esto depende en gran medida de su idioma, es decir, la localeconfiguración. Para superar esto, puede usar la Cconfiguración regional (usa el juego de caracteres ASCII) solo para este comando:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
heemayl
fuente
2
Puede usar en LANG=C ifconfig -alugar de ifconfig -ainstalaciones que no estén en inglés, puede haber problemas con grep. (es decir, en mi sistema, HWaddres direcciónHW)
Helio
@Helio, ¿qué pasa si escribes ifconfig -a | grep -i hw-*:?
JoKeR
1
@JoKeR es curioso: ¿se -*supone que eso significa algo?
muru
@muru en realidad no me confundí, pensé que no podía encontrarlo, HWpero dijo HWaddry en español como supongo / veo, direcciónHWasí que simplemente HWpuede ser;)
JoKeR
Perl regex en grep"es altamente experimental". Si desea utilizar expresiones regulares básicas, el comando es equivalente ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'o, si lo prefiere, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. He omitido el final $porque la salida incluye espacios después de la dirección MAC, y probablemente no quieras esos.
Paddy Landau
67

Puede acceder al addressarchivo para cada dispositivo en el /syssistema de archivos virtual. La dirección MAC debe estar en /sys/class/net/<device-name>/address:

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

Para todos los 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
fuente
66
+1 por no usar una herramienta que ha quedado en desuso durante una década :)
hobbs
@hobbs Espera, ¿qué herramienta es esa?
detly
@detly ifconfig
hobbs
1
@hobbs Woah. No estaba al tanto de eso. No imprime la advertencia de desuso en mi máquina.
detly
1
@detly ifconfig ha quedado en desuso durante años , y iptambién ha existido durante años.
muru
11

Aquí hay algunas maneras:

  1. grep. Hay varias expresiones regulares que las recogerán. Aquí, estoy buscando 5 repeticiones de 2 letras o números seguidos de dos puntos, luego dos caracteres. Esto -ihace que las mayúsculas y minúsculas no -osean sensibles y las grepimpresiones solo imprimen la parte coincidente. -Ehabilita expresiones regulares extendidas. La misma expresión regular también funciona con PCRE ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. El -nsuprime la producción normal y la -rpermite expresiones regulares extendidas. Usando la misma expresión regular anterior, esta secuencia de comandos intentará reemplazar todo en la línea con la parte que coincida con la expresión regular. Si la sustitución fue exitosa, se imprime la línea resultante (debido pal final de la sustitución).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Si la línea comienza con un carácter de palabra ( [a-zA-Z0-9_]) y tiene 5 campos, imprima el último.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, donde, como siempre, hay más de una forma de hacerlo. Esta es la misma lógica que la awkanterior. El -ale dice a Perl que divida cada línea de entrada en la @Fmatriz.

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

    Alternativamente, puede usar la expresión regular de los enfoques 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
fuente
6

Como algunos han comentado, ifconfigestá en desuso a favor del ipcomando. Entonces, combinando las diversas soluciones y comentarios, usaría:

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

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

Si el resultado de su sistema no es inglés en este comando, entonces tiene sentido ejecutarlo de esta manera.

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

Esto es aplicable a todas las soluciones.

Piloto6
fuente
55
En lugar de usar por grepseparado, puede filtrar awkdirectamente de esta manera: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt
Sí, hay muchas maneras de hacer esto.
Piloto6
2
Puede usar en LANG=C ifconfig -alugar de ifconfig -ainstalaciones que no estén en inglés, puede haber problemas con grep. (es decir, en mi sistema, HWaddres direcciónHW)
Helio
Buen aviso Pero en mi instalación rusa todavía es HWaddr.
Piloto6
Su instalación en Rusia puede ser, pero mi instalación en español no. ;-) Puede ser un gran problema. Por favor, ponga @Helioal comienzo del comentario. Si no, no seré notificado.
Helio