W Ubuntu za pomocą polecenia ifconfig -a
uzyskuję wszystkie informacje o moich interfejsach ethernet / wifi.
Ale muszę uzyskać jako wynik tylko adres MAC, taki jak:
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
Jak mogę to uzyskać?
W Ubuntu za pomocą polecenia ifconfig -a
uzyskuję wszystkie informacje o moich interfejsach ethernet / wifi.
Ale muszę uzyskać jako wynik tylko adres MAC, taki jak:
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
Jak mogę to uzyskać?
Odpowiedzi:
Najłatwiejszym sposobem byłoby użycie grep
z PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
umożliwi nam korzystanie z perl
kompatybilnego Regexu
grep -o
zajmie tylko dopasowaną część linii
Dopasowaliśmy HWaddr
przed naszym pożądanym dopasowaniem (adresy MAC), a następnie odrzucamy HWaddr
, \K
aby wydrukować tylko adresy MAC.
@Helio wspomniał o ważnym punkcie, który jest wysoce zależny od twojego języka, tj locale
. Ustawień. Aby obejść ten C
problem , możesz użyć ustawień regionalnych (używa zestawu znaków ASCII) tylko dla tego polecenia:
$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
ifconfig -a | grep -i hw-*
?
-*
ma coś znaczyć?
HW
ale stwierdził, że jest po HWaddr
hiszpańsku, jak sądzę / widzę, direcciónHW
więc po prostu HW
można;)
grep
„jest wysoce eksperymentalne”. Jeśli chcesz korzystać z podstawowej regex, odpowiednik polecenia jest ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'
lub, jeśli wolisz, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'
. Pominąłem końcowe, $
ponieważ wynik zawiera spacje po adresie MAC i prawdopodobnie nie chcesz ich.
Możesz uzyskać dostęp do address
pliku dla każdego urządzenia w /sys
wirtualnym systemie plików. Adres MAC powinien znajdować się w /sys/class/net/<device-name>/address
:
$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c
Dla wszystkich urządzeń:
$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
ip
także istnieje od lat.
Oto kilka sposobów:
grep
. Są różne wyrażenia regularne, które je wychwycą. Tutaj szukam 5 powtórzeń 2 liter lub cyfr, a następnie dwukropka, a następnie dowolnych dwóch znaków. -i
Sprawia, że wielkość liter nieczuły i -o
marki grep
wydrukować tylko dopasowaną część. -E
włącza rozszerzone wyrażenia regularne. Ten sam regex działa również z PCREs ( -P
).
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed
. -n
Hamuje normalne wyjście i -r
umożliwia rozszerzonych wyrażeń regularnych. Używając tego samego wyrażenia regularnego jak powyżej, ten skrypt spróbuje zastąpić wszystko w wierszu częścią, która pasuje do wyrażenia regularnego. Jeśli podstawienie zakończyło się powodzeniem, wydrukowany zostanie wynikowy wiersz (z powodu p
końca zamiany).
ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
awk
. Jeśli linia zaczyna się od znaku słowa ( [a-zA-Z0-9_]
) i ma 5 pól, wydrukuj ostatnie.
ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
Perl, gdzie, jak zwykle, jest więcej niż jeden sposób, aby to zrobić. Ta jest taka sama logika jak awk
powyżej. -a
Mówi Perl podzielić każdą linię wejścia do @F
tablicy.
ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
Alternatywnie możesz użyć wyrażenia regularnego z poprzednich podejść:
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
Jak niektórzy komentowali, ifconfig
jest przestarzałe na rzecz ip
polecenia. Łącząc różne rozwiązania i komentarze, użyłbym:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
ifconfig -a | grep HWaddr | awk '{print $5}'
Jeśli dane wyjściowe systemu nie są w języku angielskim w tym poleceniu, warto uruchomić je w ten sposób.
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
Dotyczy to wszystkich rozwiązań.
grep
osobno, możesz filtrować awk
bezpośrednio tak: ifconfig -a | awk '/HWaddr/ { print $5 }'
LANG=C ifconfig -a
zamiast ifconfig -a
do instalacji w języku innym niż angielski, mogą występować problemy z grep. (tzn. w moim systemie HWaddr
jest direcciónHW
)
@Helio
na początku komentarza. Jeśli nie, nie otrzymam powiadomienia.
LANG=C ifconfig -a
zamiastifconfig -a
do instalacji w języku innym niż angielski, mogą występować problemy z grep. (tzn. w moim systemieHWaddr
jestdirecciónHW
)