ส่งออกเฉพาะที่อยู่ MAC บน Ubuntu


36

ใน Ubuntu ด้วยคำสั่งifconfig -aฉันได้รับข้อมูลทั้งหมดเกี่ยวกับ ethernet / wifi interface ของฉัน

แต่ฉันต้องได้รับเป็นผลลัพธ์เฉพาะที่อยู่ MAC เช่น:

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

ฉันจะรับสิ่งนี้ได้อย่างไร

คำตอบ:


39

วิธีที่ง่ายที่สุดคือใช้grepกับ PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pจะทำให้เราสามารถใช้perlRegex ที่เข้ากันได้

  • grep -o จะใช้ส่วนที่จับคู่ของบรรทัดเท่านั้น

  • เราได้จับคู่HWaddrก่อนการจับคู่ที่ต้องการ (ที่อยู่ MAC) แล้วละทิ้งHWaddrโดย\Kเพื่อพิมพ์เฉพาะที่อยู่ MAC

@Helio ได้กล่าวถึงประเด็นสำคัญซึ่งขึ้นอยู่กับภาษาของคุณเช่นlocaleการตั้งค่า เพื่อเอาชนะว่าคุณสามารถใช้Cสถานที่ (ใช้ชุดอักขระ ASCII) สำหรับคำสั่งนี้เท่านั้น:

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

2
คุณอาจใช้LANG=C ifconfig -aแทนการifconfig -aติดตั้งที่ไม่ใช่ภาษาอังกฤษอาจมีปัญหากับ grep (เช่นในระบบของฉันHWaddrคือdirecciónHW)
Helio

@Helio สิ่งที่ถ้าคุณพิมพ์: ifconfig -a | grep -i hw-*?
JoKeR

1
@JoKeR แค่อยากรู้อยากเห็น - นั่น-*ควรจะหมายถึงบางสิ่งบางอย่าง?
muru

@muru ไม่จริงฉันสับสนตัวเองฉันคิดว่าเขาไม่พบ coud HWแต่เขาพูดHWaddrและสเปนในขณะที่ฉันเดา / ดูdirecciónHWดังนั้นมันก็HWเป็นไปได้;)
JoKeR

Perl regex ในgrep"เป็นการทดลองขั้นสูง" หากคุณต้องการใช้ regex พื้นฐานคำสั่งเทียบเท่าหรือหากคุณต้องการifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*' ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'ฉันได้ละเว้นการติดตาม$เนื่องจากผลลัพธ์ประกอบด้วยช่องว่างหลังจากที่อยู่ MAC และคุณอาจไม่ต้องการสิ่งเหล่านั้น
Paddy Landau

67

คุณสามารถเข้าถึงaddressไฟล์สำหรับแต่ละอุปกรณ์บน/sysระบบไฟล์เสมือน ที่อยู่ MAC ควรอยู่ใน/sys/class/net/<device-name>/address:

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

สำหรับอุปกรณ์ทั้งหมด:

$ 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 สำหรับไม่ได้ใช้เครื่องมือที่ถูกเลิกสำหรับทศวรรษที่ผ่านมา :)
ฮอบส์

@hobbs เดี๋ยวก่อนเครื่องมือตัวไหน
detly

@detly ifconfig
hobbs

1
@hobbs Woah ฉันไม่ทราบว่า ไม่พิมพ์คำเตือนการเลิกใช้งานในเครื่องของฉัน
detly

1
@detly ifconfig ถูกเลิกใช้มาหลายปีแล้วและipยังมีมานานหลายปี
muru

11

นี่เป็นวิธีไม่กี่:

  1. grep. มีนิพจน์ทั่วไปหลายอย่างที่จะเลือกสิ่งเหล่านี้ ที่นี่ฉันกำลังมองหา 5 ซ้ำ 2 ตัวอักษรหรือตัวเลขตามด้วยเครื่องหมายจุดคู่แล้วตัวละครสองตัว -iทำให้ตายกรณีการแข่งขันและ-oทำให้grepพิมพ์เฉพาะส่วนที่จับคู่ -Eเปิดใช้งานนิพจน์ทั่วไปที่ขยายเพิ่ม regex เดียวกันยังทำงานกับ PCREs ( -P)

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. -nยับยั้งการออกตามปกติและ-rช่วยให้การแสดงออกปกติขยาย ใช้ regex เดียวกันกับด้านบนสคริปต์นี้จะพยายามแทนที่ทุกอย่างในบรรทัดด้วยส่วนของมันที่ตรงกับ regex หากการทดแทนประสบความสำเร็จบรรทัดผลลัพธ์จะถูกพิมพ์ (เนื่องจากpเมื่อสิ้นสุดการทดแทน)

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. หากบรรทัดขึ้นต้นด้วยตัวอักษรคำ ( [a-zA-Z0-9_]) และมี 5 ฟิลด์ให้พิมพ์บรรทัดสุดท้าย

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl ซึ่งตามปกติมีมากกว่าหนึ่งวิธีที่จะทำ อันนี้เป็นตรรกะเดียวกับawkข้างต้น -aบอก Perl เพื่อแยกสายการป้อนข้อมูลแต่ละเข้าไปใน@Fอาร์เรย์

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

    หรือคุณสามารถใช้ regex จากวิธีก่อนหน้านี้:

    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

ในขณะที่บางคนแสดงความคิดเห็นifconfigถูกคัดค้านipคำสั่ง ดังนั้นเมื่อรวมโซลูชันและความคิดเห็นต่างๆเข้าด้วยกันฉันจะใช้:

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

4

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

หากเอาต์พุตระบบของคุณไม่ใช่ภาษาอังกฤษในคำสั่งนี้แสดงว่าเหมาะสมที่จะรันด้วยวิธีนี้

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

สิ่งนี้ใช้ได้กับโซลูชั่นทั้งหมด


5
แทนที่จะใช้grepแยกคุณสามารถกรองด้วยawkวิธีนี้โดยตรง: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt

ใช่มีหลายวิธีที่จะทำสิ่งนี้ให้สำเร็จ
Pilot6

2
คุณอาจใช้LANG=C ifconfig -aแทนการifconfig -aติดตั้งที่ไม่ใช่ภาษาอังกฤษอาจมีปัญหากับ grep (เช่นในระบบของฉันHWaddrคือdirecciónHW)
Helio

แจ้งให้ทราบที่ดี แต่ในการติดตั้งภาษารัสเซียของฉันมันยังคงเป็น HWaddr
Pilot6

การติดตั้งภาษารัสเซียของคุณอาจเป็นไปได้ แต่การติดตั้งภาษาสเปนของฉันไม่ได้ ;-)มันอาจเป็นปัญหาใหญ่ กรุณาใส่@Helioที่จุดเริ่มต้นของความคิดเห็น ถ้าไม่ฉันจะไม่ได้รับแจ้ง
Helio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.