Invia solo l'indirizzo MAC su Ubuntu


36

In Ubuntu, con comando ifconfig -a, ottengo tutte le informazioni sulle mie interfacce ethernet / wifi.

Ma devo ottenere come output solo l'indirizzo MAC, come:

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

Come posso ottenere questo?

Risposte:


41

Il modo più semplice sarebbe usare grepcon PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pci consentirà di utilizzare perlRegex compatibile

  • grep -o prenderà solo la parte corrispondente della linea

  • Abbiamo abbinato HWaddrdavanti ai nostri partita desiderata (indirizzi MAC) e poi scarta HWaddrda \Kper stampare solo gli indirizzi MAC.

@Helio ha menzionato un punto importante, questo dipende fortemente dalla tua lingua, ovvero dalle localeimpostazioni. Per ovviare a questo è possibile utilizzare le Cimpostazioni internazionali (utilizza il set di caratteri ASCII) solo per questo comando:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  

2
È possibile utilizzare LANG=C ifconfig -ainvece che ifconfig -aper installazioni non inglesi, possono esserci problemi con grep. (cioè nel mio sistema, HWaddrè direcciónHW)
Helio,

@Helio cosa succede se si digita: ifconfig -a | grep -i hw-*?
JoKeR,

1
@JoKeR è solo curioso: -*dovrebbe significare qualcosa?
muru,

@muru non mi sono davvero confuso, pensavo che non riuscisse a trovarlo, HWma ha affermato HWaddre spagnolo come immagino / vedo, direcciónHWquindi è semplicemente HWpossibile;)
JoKeR,

Perl regex in grep"è altamente sperimentale". Se si desidera utilizzare regex di base, il comando equivalente è ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'o, se si preferisce, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. Ho omesso il trailing $perché l'output include spazi dopo l'indirizzo MAC e probabilmente non li vuoi.
Paddy Landau,

67

È possibile accedere al addressfile per ciascun dispositivo sul /sysfilesystem virtuale. L'indirizzo MAC dovrebbe essere in /sys/class/net/<device-name>/address:

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

Per tutti i dispositivi:

$ 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 per non usare uno strumento che è stato deprecato per un decennio :)
hobbs

@hobbs Aspetta, quale strumento è quello?
detly

@detly ifconfig
hobbs,

1
@hobbs Woah. Non ero conscio di ciò. Non stampa l'avviso di deprecazione sulla mia macchina.
detly

1
@detly ifconfig è ormai obsoleto da anni e esiste ipda anni.
muru,

11

Ecco alcuni modi:

  1. grep. Esistono varie espressioni regolari che le raccolgono. Qui sto cercando 5 ripetizioni di 2 lettere o numeri seguite da due punti, quindi due caratteri qualsiasi. La -irende il match case insensitive e le -omarche grepstampare solo la parte corrispondente. -Eabilita espressioni regolari estese. Lo stesso regex funziona anche con PCREs ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. Il -nsopprime uscita normale e l' -rabilita le espressioni regolari estese. Usando la stessa regex di cui sopra, questo script tenterà di sostituire tutto sulla linea con la parte di essa corrispondente alla regex. Se la sostituzione ha avuto esito positivo, viene stampata la riga risultante (a causa della pfine della sostituzione).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Se la riga inizia con un carattere parola ( [a-zA-Z0-9_]) e ha 5 campi, stampa l'ultimo.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, dove, come al solito, ci sono più di un modo per farlo. Questa è la stessa logica di cui awksopra. La -adice a Perl di dividere ciascuna linea di ingresso nella @Fmatrice.

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

    In alternativa, puoi usare regex dagli approcci precedenti:

    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

Come alcuni hanno commentato, ifconfigè deprecato a favore del ipcomando. Quindi, combinando le varie soluzioni e commenti, userei:

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

4

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

Se l'output del tuo sistema non è l'inglese in questo comando, ha senso eseguirlo in questo modo.

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

Questo è applicabile a tutte le soluzioni.


5
Invece di usare grepseparatamente puoi filtrare awkdirettamente in questo modo: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt

Sì, ci sono davvero molti modi per farlo.
Pilota6,

2
È possibile utilizzare LANG=C ifconfig -ainvece che ifconfig -aper installazioni non inglesi, possono esserci problemi con grep. (cioè nel mio sistema, lo HWaddrè direcciónHW)
Helio,

Buon avviso. Ma nella mia installazione russa è ancora HWaddr.
Pilota6,

La tua installazione russa potrebbe essere, ma la mia installazione spagnola no. ;-) Può essere un grosso problema. Per favore, metti @Helioall'inizio del commento. In caso contrario, non mi verrà notificato.
Helio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.