Ubuntuでは、コマンドifconfig -a
を使用して、イーサネット/ wifiインターフェイスに関するすべての情報を取得します。
ただし、出力として取得する必要がありますonly MACアドレス。
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
どうすれば入手できますか?
最も簡単な方法は、PCREでgrep
を使用することです。
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
は、Perl
互換正規表現を使用できるようにします
grep -o
は、行の一致した部分のみを取得します
希望する一致(MACアドレス)の前にHWaddr
と一致し、\K
でHWaddr
を破棄して、MACアドレスのみを出力します。
@Helioは重要な点を述べました。これはあなたの言語、つまりlocale
設定に大きく依存しています。これを克服するには、このコマンドにのみC
ロケール(ASCII文字セットを使用)を使用できます。
$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
/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
以下にいくつかの方法を示します。
grep
。これらを取得するさまざまな正規表現があります。ここでは、2つの文字または数字の後に5つの繰り返しがあり、その後にコロンが続き、さらに2つの文字が続くのを探しています。 -i
は大文字と小文字を区別せずに一致させ、-o
はgrep
に一致部分のみを表示させます。 -E
は、拡張正規表現を有効にします。同じ正規表現はPCRE(-P
)でも機能します。
ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
sed
。 -n
は通常の出力を抑制し、-r
は拡張正規表現を有効にします。上記と同じ正規表現を使用して、このスクリプトは、行のすべてを正規表現に一致する部分で置き換えようとします。置換が成功した場合、結果の行が出力されます(置換の最後に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
は、各入力行を@F
配列に分割するようPerlに指示します。
ifconfig -a | Perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
または、以前のアプローチの正規表現を使用できます。
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 -a | grep HWaddr | awk '{print $5}'
このコマンドでシステム出力が英語以外の場合、この方法で実行することは理にかなっています。
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
これはすべてのソリューションに適用されます。
一部の人がコメントしているように、ifconfig
はip
コマンドを支持して廃止されました。したがって、さまざまなソリューションとコメントを組み合わせて、私は使用します:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF