उबंटू पर केवल मैक एड्रेस आउटपुट


36

उबंटू में, कमांड के साथ ifconfig -a, मैं अपने ईथरनेट / वाईफाई इंटरफेस के बारे में सभी जानकारी प्राप्त करता हूं।

लेकिन मुझे केवल मैक पते के आउटपुट के रूप में प्राप्त करने की आवश्यकता है , जैसे:

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

मैं इसे कैसे प्राप्त कर सकता हूं?

जवाबों:


40

grepPCRE के साथ उपयोग करने का सबसे आसान तरीका होगा :

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pहमें perlसंगत रेगेक्स का उपयोग करने में सक्षम करेगा

  • grep -o केवल लाइन के मिलान वाले हिस्से को ही लेगा

  • हम मिलते-जुलते होते HWaddrहमारे वांछित मैच (मैक पते) से पहले और उसके बाद त्यागने HWaddrसे \Kकेवल MAC पते मुद्रित करने के लिए।

@ हेलियो ने एक महत्वपूर्ण बिंदु का उल्लेख किया है, यह आपकी भाषा यानी 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 आप टाइप करता है, तो: ifconfig -a | grep -i hw-*?
JoKeR

1
@JoKeR बस जिज्ञासु है - कि -*इसका मतलब कुछ माना जाता है?
मुरु

@ मूरू वास्तव में मैं खुद को भ्रमित नहीं करता हूं मैंने सोचा कि उसने पाया कि वह नहीं मिला HWलेकिन उसने कहा HWaddrऔर स्पेनिश पर मैंने अनुमान लगाया है / देखें direcciónHWतो यह बस HWहो सकता है;)
जोकर

grep"अत्यधिक प्रयोगात्मक" में पर्ल रेगेक्स है । यदि आप मूल regex का उपयोग करना चाहते हैं, तो समतुल्य कमांड है ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*', या यदि आप चाहें, तो ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'। मैंने अनुगामी को छोड़ दिया है $क्योंकि उत्पादन में मैक पते के बाद रिक्त स्थान शामिल हैं, और शायद आप उन लोगों को नहीं चाहते हैं।
धान लैंडौ

67

आप वर्चुअल फाइल सिस्टम addressपर प्रत्येक डिवाइस के लिए फाइल को एक्सेस कर सकते हैं /sys। मैक पते में होना चाहिए /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 जो एक दशक के लिए पदावनत किया गया है :)
हॉब्स

@ ओह, रुको, कौन सा उपकरण है?
detly

@detly ifconfig
हॉब्स

1
@ होब्स वाह। मुझे इस बारे में पता नहीं था। यह मेरी मशीन पर अवतरण चेतावनी को प्रिंट नहीं करता है।
detly

1
@detly ifconfig को अब वर्षों के लिए पदावनत कर दिया गया है , और ipयह भी वर्षों से है।
मुरु

11

यहाँ कुछ तरीके हैं:

  1. grep। विभिन्न नियमित अभिव्यक्तियाँ हैं जो इन्हें उठाएंगी। यहाँ, मैं 2 अक्षरों या संख्याओं के 5 पुनरावृत्तियों की तलाश कर रहा हूं, जिसके बाद एक दो वर्ण होते हैं। -iमैच केस संवेदी बनाता है और -oबनाता grepही मिलने वाले भाग मुद्रित करें। -Eविस्तारित नियमित अभिव्यक्ति सक्षम करता है। वही रेगेक्स PCREs ( -P) के साथ भी काम करता है ।

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed-nसामान्य उत्पादन को घटाती है तथा -rविस्तारित नियमित अभिव्यक्ति सक्षम बनाता है। ऊपर के समान रेगेक्स का उपयोग करते हुए, यह स्क्रिप्ट रेगेक्स से मेल खाने वाले भाग के साथ लाइन पर सब कुछ बदलने का प्रयास करेगी। यदि प्रतिस्थापन सफल था, तो परिणामी रेखा मुद्रित होती है ( 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. पर्ल, जहां, हमेशा की तरह, इसे करने के एक से अधिक तरीके हैं। यह एक ही तर्क है जो awkउपरोक्त है। -aपर्ल बताता में प्रत्येक इनपुट लाइन विभाजित करने के लिए @Fसरणी।

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

    वैकल्पिक रूप से, आप पिछले दृष्टिकोण से रेगेक्स का उपयोग कर सकते हैं:

    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

हां, इसे पूरा करने के कई तरीके हैं।
पायलट 6

2
आप गैर-अंग्रेजी इंस्टॉलेशन के LANG=C ifconfig -aबजाय उपयोग ifconfig -aकर सकते हैं, grep के साथ समस्या हो सकती है। (यानी मेरे सिस्टम में, HWaddrहै direcciónHW)
हेलियो

अच्छी सूचना है। लेकिन मेरी रूसी स्थापना में यह अभी भी HWaddr है।
पायलट 6

आपकी रूसी स्थापना हो सकती है, लेकिन मेरी स्पेनिश स्थापना नहीं है। ;-) यह एक बहुत बड़ी समस्या हो सकती है। कृपया, @Helioटिप्पणी की शुरुआत में रखें। यदि नहीं, तो मुझे सूचित नहीं किया जाएगा।
हेलियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.