Chỉ xuất địa chỉ MAC trên Ubuntu


36

Trong Ubuntu, với lệnh ifconfig -a, tôi có được tất cả thông tin về giao diện ethernet / wifi của mình.

Nhưng tôi cần phải có được như đầu ra chỉ địa chỉ MAC, như:

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

Làm thế nào tôi có thể có được điều này?

Câu trả lời:


40

Cách dễ nhất sẽ là sử dụng grepvới PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Psẽ cho phép chúng tôi sử dụng perlRegex tương thích

  • grep -o sẽ chỉ lấy phần phù hợp của dòng

  • Chúng tôi đã khớp HWaddrtrước khi khớp mong muốn (địa chỉ MAC) và sau đó loại bỏ HWaddrbằng cách \Kchỉ in các địa chỉ MAC.

@Helio đã đề cập đến một điểm quan trọng, điều này phụ thuộc nhiều vào ngôn ngữ của bạn tức là localecài đặt. Để khắc phục điều đó, bạn chỉ có thể sử dụng Cngôn ngữ (sử dụng bộ ký tự ASCII) cho lệnh này:

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

2
Bạn có thể sử dụng LANG=C ifconfig -athay vì ifconfig -acài đặt không phải tiếng Anh, có thể là vấn đề với grep. (tức là trong hệ thống của tôi, HWaddrdirecciónHW)
Helio

@Helio nếu bạn gõ : ifconfig -a | grep -i hw-*?
JoKeR

1
@JoKeR chỉ tò mò - đó có -*phải là ý nghĩa gì không?
muru

@muru không thực sự tôi nhầm lẫn bản thân mình, tôi nghĩ ông coudn't tìm HWnhưng ông nói trên HWaddrvà Tây Ban Nha như tôi đoán / nhìn thấy direcciónHWvì vậy nó chỉ đơn giản là chỉ HWcó thể;)
Joker

Regl Perl trong grep"rất thử nghiệm". Nếu bạn muốn sử dụng regex cơ bản, lệnh tương đương là ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'hoặc, nếu bạn thích , ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. Tôi đã bỏ qua dấu vết $vì đầu ra bao gồm khoảng trắng sau địa chỉ MAC và có lẽ bạn không muốn chúng.
Paddy Landau

67

Bạn có thể truy cập addresstệp cho từng thiết bị trên /syshệ thống tệp ảo. Địa chỉ MAC phải ở /sys/class/net/<device-name>/address:

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

Đối với tất cả các thiết bị:

$ 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 vì không sử dụng một công cụ không được dùng trong một thập kỷ :)
hobbs

@hobbs Chờ đã, công cụ nào vậy?
gièm pha

@detly ifconfig
hobbs

1
@hobbs Woah. Tôi đã không nhận thức được điều đó. Nó không in cảnh báo khấu hao trên máy của tôi.
gièm pha

1
@detly ifconfig đã bị từ chối trong nhiều năm nay và ipcũng đã xuất hiện trong nhiều năm.
muru

11

Dưới đây là một vài cách:

  1. grep. Có nhiều biểu thức chính quy sẽ chọn những thứ này. Ở đây, tôi đang tìm kiếm 5 lần lặp lại gồm 2 chữ cái hoặc số theo sau là dấu hai chấm, sau đó là hai ký tự bất kỳ. Việc -ilàm cho trường hợp khớp không nhạy cảm và -olàm cho grepchỉ in phần phù hợp. -Echo phép mở rộng biểu thức chính quy. Regex tương tự cũng hoạt động với PCREs ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. Việc -ntriệt tiêu đầu ra bình thường và -rcho phép các biểu thức chính quy mở rộng. Sử dụng cùng một biểu thức như trên, tập lệnh này sẽ cố gắng thay thế mọi thứ trên dòng bằng phần của nó phù hợp với biểu thức chính quy. Nếu thay thế thành công, dòng kết quả được in (vì pở cuối thay thế).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Nếu dòng bắt đầu bằng một ký tự từ ( [a-zA-Z0-9_]) và có 5 trường, hãy in trường cuối cùng.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, ở đâu, như thường lệ, có nhiều hơn một cách để làm điều đó. Đây là logic tương tự như awktrên. Các -aperl nói để phân chia từng dòng đầu vào thành @Fmảng.

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

    Ngoài ra, bạn có thể sử dụng regex từ các phương pháp trước:

    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

Như một số người đã bình luận, ifconfigkhông được ủng hộ iplệnh này. Vì vậy, kết hợp các giải pháp và ý kiến ​​khác nhau, tôi sẽ sử dụng:

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

4

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

Nếu đầu ra hệ thống của bạn không phải là tiếng Anh trong lệnh này, thì sẽ hợp lý khi chạy nó theo cách này.

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

Điều này được áp dụng cho tất cả các giải pháp.


5
Thay vì sử dụng grepriêng, bạn có thể lọc awktrực tiếp như thế này: ifconfig -a | awk '/HWaddr/ { print $5 }'
krt

Vâng, thực sự có rất nhiều cách để thực hiện điều này.
Pilot6

2
Bạn có thể sử dụng LANG=C ifconfig -athay vì ifconfig -acài đặt không phải tiếng Anh, có thể là vấn đề với grep. (tức là trong hệ thống của tôi, HWaddrdirecciónHW)
Helio

Thông báo tốt. Nhưng trong bản cài đặt tiếng Nga của tôi, nó vẫn là HWaddr.
Pilot6

Cài đặt tiếng Nga của bạn có thể, nhưng cài đặt tiếng Tây Ban Nha của tôi thì không. ;-) Nó có thể là một vấn đề lớn. Xin vui lòng, đặt @Helioở đầu nhận xét. Nếu không, tôi sẽ không được thông báo.
Helio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.