ใน 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
ฉันจะรับสิ่งนี้ได้อย่างไร
ใน 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
ฉันจะรับสิ่งนี้ได้อย่างไร
คำตอบ:
วิธีที่ง่ายที่สุดคือใช้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
ifconfig -a | grep -i hw-*?
-*ควรจะหมายถึงบางสิ่งบางอย่าง?
HWแต่เขาพูดHWaddrและสเปนในขณะที่ฉันเดา / ดูdirecciónHWดังนั้นมันก็HWเป็นไปได้;)
grep"เป็นการทดลองขั้นสูง" หากคุณต้องการใช้ regex พื้นฐานคำสั่งเทียบเท่าหรือหากคุณต้องการifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*' ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'ฉันได้ละเว้นการติดตาม$เนื่องจากผลลัพธ์ประกอบด้วยช่องว่างหลังจากที่อยู่ MAC และคุณอาจไม่ต้องการสิ่งเหล่านั้น
คุณสามารถเข้าถึง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
ipยังมีมานานหลายปี
นี่เป็นวิธีไม่กี่:
grep. มีนิพจน์ทั่วไปหลายอย่างที่จะเลือกสิ่งเหล่านี้ ที่นี่ฉันกำลังมองหา 5 ซ้ำ 2 ตัวอักษรหรือตัวเลขตามด้วยเครื่องหมายจุดคู่แล้วตัวละครสองตัว -iทำให้ตายกรณีการแข่งขันและ-oทำให้grepพิมพ์เฉพาะส่วนที่จับคู่ -Eเปิดใช้งานนิพจน์ทั่วไปที่ขยายเพิ่ม regex เดียวกันยังทำงานกับ PCREs ( -P)
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed. -nยับยั้งการออกตามปกติและ-rช่วยให้การแสดงออกปกติขยาย ใช้ regex เดียวกันกับด้านบนสคริปต์นี้จะพยายามแทนที่ทุกอย่างในบรรทัดด้วยส่วนของมันที่ตรงกับ regex หากการทดแทนประสบความสำเร็จบรรทัดผลลัพธ์จะถูกพิมพ์ (เนื่องจากpเมื่อสิ้นสุดการทดแทน)
ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
awk. หากบรรทัดขึ้นต้นด้วยตัวอักษรคำ ( [a-zA-Z0-9_]) และมี 5 ฟิลด์ให้พิมพ์บรรทัดสุดท้าย
ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
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'
coreutils
LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
ในขณะที่บางคนแสดงความคิดเห็นifconfigถูกคัดค้านipคำสั่ง ดังนั้นเมื่อรวมโซลูชันและความคิดเห็นต่างๆเข้าด้วยกันฉันจะใช้:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
ifconfig -a | grep HWaddr | awk '{print $5}'
หากเอาต์พุตระบบของคุณไม่ใช่ภาษาอังกฤษในคำสั่งนี้แสดงว่าเหมาะสมที่จะรันด้วยวิธีนี้
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
สิ่งนี้ใช้ได้กับโซลูชั่นทั้งหมด
grepแยกคุณสามารถกรองด้วยawkวิธีนี้โดยตรง: ifconfig -a | awk '/HWaddr/ { print $5 }'
LANG=C ifconfig -aแทนการifconfig -aติดตั้งที่ไม่ใช่ภาษาอังกฤษอาจมีปัญหากับ grep (เช่นในระบบของฉันHWaddrคือdirecciónHW)
@Helioที่จุดเริ่มต้นของความคิดเห็น ถ้าไม่ฉันจะไม่ได้รับแจ้ง
LANG=C ifconfig -aแทนการifconfig -aติดตั้งที่ไม่ใช่ภาษาอังกฤษอาจมีปัญหากับ grep (เช่นในระบบของฉันHWaddrคือdirecciónHW)