Nur MAC-Adresse auf Ubuntu ausgeben


36

In Ubuntu ifconfig -aerhalte ich mit dem Befehl alle Informationen zu meinen Ethernet- / WLAN-Schnittstellen.

Aber ich muss als Ausgabe nur die MAC-Adresse erhalten, wie:

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

Wie kann ich das bekommen?

Antworten:


40

Am einfachsten ist die Verwendung grepmit PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Permöglicht es uns, perlkompatibles Regex zu verwenden

  • grep -o wird nur den passenden Teil der Linie nehmen

  • Wir haben abgestimmt , HWaddrbevor unsere gewünschtes Spiel (MAC - Adressen) und dann verwerfen , HWaddrindem \Knur die MAC - Adressen zu drucken.

@Helio hat einen wichtigen Punkt erwähnt, dies hängt stark von Ihrer Sprache ab, dh von den localeEinstellungen. Um dies zu umgehen, können Sie das CGebietsschema (verwendet ASCII-Zeichensatz) nur für diesen Befehl verwenden:

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

2
Sie können LANG=C ifconfig -astatt ifconfig -afür nicht-englische Installationen verwenden, kann Probleme mit grep geben. (dh in meinem System HWaddrist direcciónHW)
Helio

@Helio was ist, wenn Sie Folgendes eingeben: ifconfig -a | grep -i hw-*?
JoKeR

1
@JoKeR nur neugierig - -*soll das was heißen?
muru

@muru nicht wirklich ich habe mich verwirrt ich dachte er findet es nicht HWaber er gab an HWaddrund spanisch wie ich denke / sehe direcciónHWso kann es einfach HWsein;)
JoKeR

Perl Regex in grep"ist sehr experimentell". Wenn Sie grundlegende Regex verwenden möchten, der entsprechende Befehl ist ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'oder, wenn Sie es vorziehen, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. Ich habe das Trailing weggelassen, $weil die Ausgabe Leerzeichen nach der MAC-Adresse enthält, und wahrscheinlich möchten Sie diese nicht.
Paddy Landau

67

Sie können addressfür jedes Gerät im /sysvirtuellen Dateisystem auf die Datei zugreifen . Die MAC-Adresse sollte lauten /sys/class/net/<device-name>/address:

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

Für alle Geräte:

$ 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 für die nicht mit einem Werkzeug, das seit einem Jahrzehnt veraltet ist :)
Hobbs

@hobbs Warten Sie, welches Tool ist das?
Detly

@detly ifconfig
hobbs

1
@hobbs Woah. Das war mir nicht bewusst. Es wird keine Warnung über die Nichtbeachtung auf meinem Computer gedruckt.
Detly

1
@detly ifconfig ist schon seit veraltet Jahren jetzt, und iphat auch schon seit Jahren.
muru

11

Hier sind einige Möglichkeiten:

  1. grep. Es gibt verschiedene reguläre Ausdrücke, die diese aufgreifen. Hier suche ich nach 5 Wiederholungen von 2 Buchstaben oder Zahlen, gefolgt von einem Doppelpunkt und zwei beliebigen Zeichen. Das -imacht das Spiel Groß- und Kleinschreibung und die -oMarken grepdrucken nur die angepaßten Teils. -Eaktiviert erweiterte reguläre Ausdrücke. Der gleiche reguläre Ausdruck funktioniert auch mit PCREs ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. Das -nunterdrückt die normale Ausgabe und -raktiviert erweiterte reguläre Ausdrücke. Mit demselben regulären Ausdruck wie oben versucht dieses Skript, alles in der Zeile durch den Teil zu ersetzen, der mit dem regulären Ausdruck übereinstimmt. Wenn die Ersetzung erfolgreich war, wird die resultierende Zeile gedruckt (aufgrund der pam Ende der Ersetzung).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Wenn die Zeile mit einem Wortzeichen ( [a-zA-Z0-9_]) beginnt und 5 Felder enthält, drucken Sie das letzte aus.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, wo es wie immer mehr als eine Möglichkeit gibt. Dies ist die gleiche Logik wie awkoben. Das -aweist Perl an, jede Eingabezeile in das @FArray aufzuteilen .

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

    Alternativ können Sie den regulären Ausdruck aus den vorherigen Ansätzen verwenden:

    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
    

5

Wie einige kommentiert haben, ifconfigwird zugunsten des ipBefehls veraltet . Wenn ich also die verschiedenen Lösungen und Kommentare kombiniere, würde ich Folgendes verwenden:

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

4

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

Wenn Ihre Systemausgabe in diesem Befehl nicht Englisch ist, ist es sinnvoll, sie auf diese Weise auszuführen.

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

Dies gilt für alle Lösungen.


5
Anstatt grepseparat zu verwenden, können Sie awkdirekt nach ifconfig -a | awk '/HWaddr/ { print $5 }'
Folgendem

Ja, es gibt wirklich viele Möglichkeiten, dies zu erreichen.
Pilot6

2
Sie können LANG=C ifconfig -astatt ifconfig -afür nicht-englische Installationen verwenden, kann Probleme mit grep geben. (dh in meinem System HWaddrist direcciónHW)
Helio

Gute Nachricht. Aber in meiner russischen Installation ist es immer noch HWaddr.
Pilot6

Ihre russische Installation kann sein, aber meine spanische Installation nicht. ;-) Es kann ein riesiges Problem sein. Bitte setzen Sie @Helioam Anfang des Kommentars. Wenn nicht, werde ich nicht benachrichtigt.
Helio
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.