ใน 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
จะทำให้เราสามารถใช้perl
Regex ที่เข้ากันได้
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
)