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?

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  

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

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
    

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.