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?

simone_s1994
quelle

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  
heemayl
quelle
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
muru
quelle
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
    
terdon
quelle
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
user352726
quelle
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.

Pilot6
quelle
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