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


36

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

ただし、次のようなMACアドレスのみを出力として取得する必要があります。

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

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

回答:


40

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

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pperl互換性のある正規表現を使用できるようになります

  • 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  

2
あなたは使用することLANG=C ifconfig -aの代わりにifconfig -agrepをして問題があることができ、英語以外の環境のために。(つまり、私のシステムでHWaddrは、direcciónHW
Helio

@Helioと入力するとどうなりますifconfig -a | grep -i hw-*か?
-JoKeR

1
@JoKeRは好奇心が強い-それは-*何かを意味するはずですか?
ムル

@muru私は自分を混乱させたわけではないHWが、彼は見つけられなかったと思ったが、彼はHWaddr私が推測/見るdirecciónHWようにスペイン語で述べたので、それは単にそうなるHW可能性がある;)
JoKeR

grep「非常に実験的」のPerl正規表現。基本的な正規表現を使用する場合、同等のコマンドは、ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'または必要に応じてですifconfig -a | grep -o 'HWaddr [a-f0-9:]*'$出力にはMACアドレスの後にスペースが含まれており、おそらくそれらは必要ないので、末尾を省略しました。
水田ランダウ

67

仮想ファイルシステム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

6
:)十年で廃止されていますツールを使用していないため1
ホッブズ

@hobbs待って、どのツールですか?
確実に

@detly ifconfigコマンド
ホッブズ

1
@hobbsわあ。私はそれを知りませんでした。私のマシンには非推奨の警告は表示されません。
確実に

1
@detly ifconfigコマンドは非推奨されていますになりました、とipも年前から出回っています。
ムル

11

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

  1. grep。これらを取得するさまざまな正規表現があります。ここでは、2つの文字または数字の後にコロンが続き、さらに2つの文字が5回繰り返されることを探しています。-iマッチケースが鈍感と-oなりますがgrepのみマッチした部分を印刷します。-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各入力ラインを分割するPerlを指示@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

はい、これを実現する方法は本当にたくさんあります。
Pilot6

2
あなたは使用することLANG=C ifconfig -aの代わりにifconfig -agrepをして問題があることができ、英語以外の環境のために。(つまり、私のシステムでHWaddrdirecciónHW
Helio

良いお知らせ。しかし、私のロシア語のインストールでは、まだHWaddrです。
Pilot6

ロシア語のインストールは可能ですが、私のスペイン語のインストールはそうではありません。;-)それは大きな問題になる可能性があります。@Helioコメントの冒頭に書いてください。そうでない場合、通知されません。
ヘリオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.