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?
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:
Il modo più semplice sarebbe usare grep
con PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
ci consentirà di utilizzare perl
Regex compatibile
grep -o
prenderà solo la parte corrispondente della linea
Abbiamo abbinato HWaddr
davanti ai nostri partita desiderata (indirizzi MAC) e poi scarta HWaddr
da \K
per stampare solo gli indirizzi MAC.
@Helio ha menzionato un punto importante, questo dipende fortemente dalla tua lingua, ovvero dalle locale
impostazioni. Per ovviare a questo è possibile utilizzare le C
impostazioni 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
ifconfig -a | grep -i hw-*
?
-*
dovrebbe significare qualcosa?
HW
ma ha affermato HWaddr
e spagnolo come immagino / vedo, direcciónHW
quindi è semplicemente HW
possibile;)
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.
È possibile accedere al address
file per ciascun dispositivo sul /sys
filesystem 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
ip
da anni.
Ecco alcuni modi:
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 -i
rende il match case insensitive e le -o
marche grep
stampare solo la parte corrispondente. -E
abilita espressioni regolari estese. Lo stesso regex funziona anche con PCREs ( -P
).
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed
. Il -n
sopprime uscita normale e l' -r
abilita 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 p
fine della sostituzione).
ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
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}'
Perl, dove, come al solito, ci sono più di un modo per farlo. Questa è la stessa logica di cui awk
sopra. La -a
dice a Perl di dividere ciascuna linea di ingresso nella @F
matrice.
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'
Coreutils.
LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
Come alcuni hanno commentato, ifconfig
è deprecato a favore del ip
comando. Quindi, combinando le varie soluzioni e commenti, userei:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
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.
grep
separatamente puoi filtrare awk
direttamente in questo modo: ifconfig -a | awk '/HWaddr/ { print $5 }'
LANG=C ifconfig -a
invece che ifconfig -a
per installazioni non inglesi, possono esserci problemi con grep. (cioè nel mio sistema, lo HWaddr
è direcciónHW
)
@Helio
all'inizio del commento. In caso contrario, non mi verrà notificato.
LANG=C ifconfig -a
invece cheifconfig -a
per installazioni non inglesi, possono esserci problemi con grep. (cioè nel mio sistema,HWaddr
èdirecciónHW
)