Wypisz tylko adres MAC na Ubuntu

36

W Ubuntu za pomocą polecenia ifconfig -auzyskuję 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ć?

simone_s1994
źródło

Odpowiedzi:

40

Najłatwiejszym sposobem byłoby użycie grepz PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pumożliwi nam korzystanie z perlkompatybilnego Regexu

  • grep -o zajmie tylko dopasowaną część linii

  • Dopasowaliśmy HWaddrprzed naszym pożądanym dopasowaniem (adresy MAC), a następnie odrzucamy HWaddr, \Kaby 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 Cproblem , 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  
heemayl
źródło
2
Możesz używać LANG=C ifconfig -azamiast ifconfig -ado instalacji w języku innym niż angielski, mogą występować problemy z grep. (tzn. w moim systemie HWaddrjest direcciónHW)
Helio
@Helio co jeśli wpiszesz: ifconfig -a | grep -i hw-*?
JoKeR
1
@JoKeR jest po prostu ciekawy - czy to -*ma coś znaczyć?
muru
@muru tak naprawdę nie myliłem się Myślałem, że nie może go znaleźć, HWale stwierdził, że jest po HWaddrhiszpańsku, jak sądzę / widzę, direcciónHWwięc po prostu HWmożna;)
JoKeR
Wyrażenie regularne Perla w 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.
Paddy Landau
67

Możesz uzyskać dostęp do addresspliku dla każdego urządzenia w /syswirtualnym 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
muru
źródło
6
+1 za nieużywanie narzędzia, które było przestarzałe od dekady :)
hobbs
@ Hobbs Poczekaj, które to narzędzie?
detly
@detly ifconfig
Hobbs
1
@hobbs Woah. Nie byłam tego świadoma. Nie drukuje ostrzeżenia o wycofaniu na moim komputerze.
detly
1
@detly ifconfig jest przestarzałe od lat , a iptakże istnieje od lat.
muru
11

Oto kilka sposobów:

  1. 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. -iSprawia, że wielkość liter nieczuły i -omarki grepwydrukować tylko dopasowaną część. -Ewłącza rozszerzone wyrażenia regularne. Ten sam regex działa również z PCREs ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. -nHamuje normalne wyjście i -rumoż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 pkońca zamiany).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. 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}'
    
  4. Perl, gdzie, jak zwykle, jest więcej niż jeden sposób, aby to zrobić. Ta jest taka sama logika jak awkpowyżej. -aMówi Perl podzielić każdą linię wejścia do @Ftablicy.

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

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    
terdon
źródło
5

Jak niektórzy komentowali, ifconfigjest przestarzałe na rzecz ippolecenia. Łą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
użytkownik352726
źródło
4

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ń.

Pilot 6
źródło
5
Zamiast używać greposobno, możesz filtrować awkbezpośrednio tak: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt
Tak, jest naprawdę wiele sposobów, aby to zrobić.
Pilot6
2
Możesz używać LANG=C ifconfig -azamiast ifconfig -ado instalacji w języku innym niż angielski, mogą występować problemy z grep. (tzn. w moim systemie HWaddrjest direcciónHW)
Helio
Dobra uwaga. Ale w mojej rosyjskiej instalacji wciąż jest to HWaddr.
Pilot6
Twoja rosyjska instalacja może być, ale moja hiszpańska nie. ;-) To może być ogromny problem. Proszę umieścić @Heliona początku komentarza. Jeśli nie, nie otrzymam powiadomienia.
Helio