Ubuntuでは、command ifconfig -a
を使用して、イーサネット/ wifiインターフェイスに関するすべての情報を取得します。
ただし、次のようなMACアドレスのみを出力として取得する必要があります。
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
どうすれば入手できますか?
Ubuntuでは、command ifconfig -a
を使用して、イーサネット/ wifiインターフェイスに関するすべての情報を取得します。
ただし、次のようなMACアドレスのみを出力として取得する必要があります。
ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef
どうすれば入手できますか?
回答:
最も簡単な方法はgrep
、PCREで使用することです。
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
perl
互換性のある正規表現を使用できるようになります
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
ifconfig -a | grep -i hw-*
か?
-*
何かを意味するはずですか?
HW
が、彼は見つけられなかったと思ったが、彼はHWaddr
私が推測/見るdirecciónHW
ようにスペイン語で述べたので、それは単にそうなるHW
可能性がある;)
grep
「非常に実験的」のPerl正規表現。基本的な正規表現を使用する場合、同等のコマンドは、ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'
または必要に応じてですifconfig -a | grep -o 'HWaddr [a-f0-9:]*'
。$
出力にはMACアドレスの後にスペースが含まれており、おそらくそれらは必要ないので、末尾を省略しました。
仮想ファイルシステム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
ip
も年前から出回っています。
以下にいくつかの方法を示します。
grep
。これらを取得するさまざまな正規表現があります。ここでは、2つの文字または数字の後にコロンが続き、さらに2つの文字が5回繰り返されることを探しています。-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
各入力ラインを分割するPerlを指示@F
配列。
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
しているように、ip
コマンドを支持して廃止されました。したがって、さまざまなソリューションとコメントを組み合わせて、私は使用します:
$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF
ifconfig -a | grep HWaddr | awk '{print $5}'
このコマンドでシステム出力が英語以外の場合、この方法で実行することは理にかなっています。
LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'
これはすべてのソリューションに適用されます。
grep
個別に使用する代わりに、次のawk
ように直接フィルタリングできます。 ifconfig -a | awk '/HWaddr/ { print $5 }'
LANG=C ifconfig -a
の代わりにifconfig -a
grepをして問題があることができ、英語以外の環境のために。(つまり、私のシステムでHWaddr
はdirecciónHW
)
@Helio
コメントの冒頭に書いてください。そうでない場合、通知されません。
LANG=C ifconfig -a
の代わりにifconfig -a
grepをして問題があることができ、英語以外の環境のために。(つまり、私のシステムでHWaddr
は、direcciónHW
)