Keluarkan hanya alamat MAC di Ubuntu

36

Di Ubuntu, dengan perintah ifconfig -a, saya mendapatkan semua informasi tentang antarmuka ethernet / wifi saya.

Tapi saya perlu mendapatkan sebagai output hanya alamat MAC, seperti:

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

Bagaimana saya bisa mendapatkan ini?

simone_s1994
sumber

Jawaban:

40

Cara termudah adalah dengan menggunakan grepPCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pakan memungkinkan kami untuk menggunakan perlRegex yang kompatibel

  • grep -o hanya akan mengambil bagian garis yang cocok

  • Kami telah mencocokkan HWaddrsebelum pencocokan yang kami inginkan (alamat MAC) dan kemudian membuang HWaddrdengan \Kmencetak hanya alamat MAC.

@ Halo telah menyebutkan poin penting, ini sangat tergantung pada localepengaturan bahasa Anda yaitu . Untuk mengatasinya Anda dapat menggunakan Clokal (menggunakan set karakter ASCII) hanya untuk perintah ini:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
heemayl
sumber
2
Anda bisa menggunakan LANG=C ifconfig -aalih-alih ifconfig -auntuk instalasi non-Inggris, bisa jadi masalah dengan grep. (Yaitu Dalam sistem saya, HWaddradalah direcciónHW)
Helio
@Helio bagaimana jika Anda mengetik: ifconfig -a | grep -i hw-*?
JoKeR
1
@ JoKeR hanya ingin tahu - apakah itu -*berarti sesuatu?
muru
@muru tidak benar-benar saya bingung sendiri, saya pikir dia tidak bisa menemukan HWtetapi dia menyatakan HWaddrdan berbahasa Spanyol seperti yang saya kira / lihat direcciónHWjadi itu HWbisa saja;)
JoKeR
Perl regex dalam grep"sangat eksperimental". Jika Anda ingin menggunakan regex dasar, perintah yang setara adalah ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'atau, jika Anda mau ifconfig -a | grep -o 'HWaddr [a-f0-9:]*',. Saya telah menghilangkan trailing $karena output menyertakan spasi setelah alamat MAC, dan mungkin Anda tidak menginginkannya.
Paddy Landau
67

Anda dapat mengakses addressfile untuk setiap perangkat di /syssistem file virtual. Alamat MAC harus dalam /sys/class/net/<device-name>/address:

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

Untuk semua perangkat:

$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45
muru
sumber
6
+1 karena tidak menggunakan alat yang sudah tidak digunakan lagi selama satu dekade :)
hobbs
@obb Tunggu, alat apa itu?
detly
@detly ifconfig
hobbs
1
@ hobbs Woah. Aku tidak menyadari itu sebelumnya. Itu tidak mencetak peringatan penghentian pada mesin saya.
detly
1
@tetly ifconfig's sudah ditinggalkan selama bertahun - tahun sekarang, dan ipjuga telah ada selama bertahun-tahun.
muru
11

Berikut ini beberapa cara:

  1. grep. Ada berbagai ekspresi reguler yang akan mengambil ini. Di sini, saya mencari 5 pengulangan dari 2 huruf atau angka diikuti oleh titik dua, lalu dua karakter. The -imembuat kasus pertandingan sensitif dan -omerek grepmencetak hanya bagian cocok. -Ememungkinkan ekspresi reguler yang diperluas. Regex yang sama juga berfungsi dengan PCRE ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. The -nmenekan output normal dan -rmemungkinkan ekspresi reguler diperpanjang. Dengan menggunakan regex yang sama seperti di atas, skrip ini akan berusaha mengganti semua yang ada di baris dengan bagian yang cocok dengan regex. Jika substitusi berhasil, garis yang dihasilkan dicetak (karena ppada akhir substitusi).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Jika baris dimulai dengan karakter kata ( [a-zA-Z0-9_]), dan memiliki 5 bidang, cetak yang terakhir.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, di mana, seperti biasa, ada lebih dari satu cara untuk melakukannya. Ini adalah logika yang sama dengan yang di awkatas. The -amemberitahu perl untuk membagi setiap jalur input ke dalam @Farray.

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

    Atau, Anda dapat menggunakan regex dari pendekatan sebelumnya:

    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
sumber
5

Seperti yang dikomentari oleh beberapa orang, ifconfigsudah tidak digunakan lagi untuk ipperintah ini. Jadi menggabungkan berbagai solusi dan komentar, saya akan menggunakan:

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

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

Jika output sistem Anda bukan bahasa Inggris dalam perintah ini, maka masuk akal untuk menjalankannya dengan cara ini.

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

Ini berlaku untuk semua solusi.

Pilot6
sumber
5
Alih-alih menggunakan grepsecara terpisah, Anda dapat memfilter dengan awklangsung seperti ini: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt
Ya, ada banyak cara untuk menyelesaikannya.
Pilot6
2
Anda bisa menggunakan LANG=C ifconfig -aalih-alih ifconfig -auntuk instalasi non-Inggris, bisa jadi masalah dengan grep. (Yaitu Dalam sistem saya, HWaddradalah direcciónHW)
Helio
Pemberitahuan yang baik Tetapi dalam instalasi Rusia saya masih HWaddr.
Pilot6
Instalasi Rusia Anda mungkin, tetapi instalasi Spanyol saya tidak. ;-) Ini bisa menjadi masalah besar. Tolong, letakkan @Heliodi awal komentar. Jika tidak, saya tidak akan diberitahu.
Helio