web-dev-qa-db-ja.com

UbuntuでMACアドレスのみを出力します

Ubuntuでは、コマンドifconfig -aを使用して、イーサネット/ wifiインターフェイスに関するすべての情報を取得します。

ただし、出力として取得する必要がありますonly MACアドレス。

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

どうすれば入手できますか?

30
simone_s1994

最も簡単な方法は、PCREでgrepを使用することです。

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pは、Perl互換正規表現を使用できるようにします

  • grep -oは、行の一致した部分のみを取得します

  • 希望する一致(MACアドレス)の前にHWaddrと一致し、\KHWaddrを破棄して、MACアドレスのみを出力します。

@Helioは重要な点を述べました。これはあなたの言語、つまりlocale設定に大きく依存しています。これを克服するには、このコマンドにのみCロケール(ASCII文字セットを使用)を使用できます。

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

/sys仮想ファイルシステム上の各デバイスのaddressファイルにアクセスできます。 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
58
muru

以下にいくつかの方法を示します。

  1. grep。これらを取得するさまざまな正規表現があります。ここでは、2つの文字または数字の後に5つの繰り返しがあり、その後にコロンが続き、さらに2つの文字が続くのを探しています。 -iは大文字と小文字を区別せずに一致させ、-ogrepに一致部分のみを表示させます。 -Eは、拡張正規表現を有効にします。同じ正規表現はPCRE(-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. Perl、いつものように、複数の方法があります。これは、上記のawkと同じロジックです。 -aは、各入力行を@F配列に分割するようPerlに指示します。

    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
    
9
terdon

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

このコマンドでシステム出力が英語以外の場合、この方法で実行することは理にかなっています。

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

これはすべてのソリューションに適用されます。

4
Pilot6

一部の人がコメントしているように、ifconfigipコマンドを支持して廃止されました。したがって、さまざまなソリューションとコメントを組み合わせて、私は使用します:

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