デフォルトでは ifconfig
は利用可能なすべてのインターフェイスを表示してくれるが、active
なものだけを表示したい場合はどうすればいいのだろう?例えば、以下の en0
のように。
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 14:10:9f:e0:eb:c9
inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4
inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
nd6 options=1<PERFORMNUD>
media: autoselect
**status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=60<TSO4,TSO6>
ether 32:00:14:e7:4f:80
media: autoselect <full-duplex>
**status: inactive**
ifconfig en0は、
en0が常にアクティブであるとは限らないので、
ifconfig en0` を満たさないことに注意してください ;)
私はMac OS Xを使っています。
すべてのアクティブなサービスの完全な説明を取得するには、以下を試してください。
ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'
この単純な正規表現では、アクティブなインターフェイスとそのすべての情報のみが除外されます。 〜/ .profileまたは〜/ .bash_profileファイル(多分ifconfiga)にこれのエイリアスを入れてください?)。
インターフェース名(スクリプトに役立つ)を取得するには、以下を使用します。
ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'
これを機能させるには、pcregrepをインストールする必要があります。 pcreパッケージのmacportsにあります。 または、これは「pcregrep -M -o」の代わりに「grep -Pzo」を使用してGNU grepで機能する必要がありますが、残りは同じですが、これをテストしていません。
もし "entry "がstatus: active
を含んでいる場合だけ表示したいのであれば、以下のawkプログラムのようなものをifconfig出力のフィルターとして使うことができる:
#!/usr/bin/awk -f
BEGIN { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/ { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/ { buffer = buffer "\n" $0 }
END { if(print_it) print buffer }
各「エントリー」が始まったら(行が空であるか、タブで始まらない)、そのエントリーをバッファに保存し始める。このバッファに、タブで始まる行を追加する。もしそのような行があったら、新しい "entry "が始まる(または入力が終了する)ときに、バッファ(前の "entry")をプリントアウトする。
上記のプログラム・テキストをファイルに保存し、次のように使用する:
ifconfig -a | awk -f /path/to/file
あるいは、ファイルを chmod +x
すれば、少し簡略化できる:
ifconfig -a | /path/to/file
あなたのコメントと質問を読むと、実際にはIPアドレスが割り当てられているインターフェイスだけを取得したいようだ。
これは ifconfig
と grep
ですぐにできる。
コマンドを実行する:
ifconfig | grep 'Link\|inet'
のようなものが得られるはずだ:
次のようになります; eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55 eth1 Link encap:Ethernet HWaddr 00:11:22:33:44:66 inet addr:192.168.0.8 Bcast:192.168.0.255 Mask:255.255.255.0 lo Link encap:ローカルループバック inet addr:127.0.0.1 Mask:255.0.0.0 </pre>;
これは、各行にインターフェース名とIPがあればそれを表示します。
もっと具体的なREGEXマジックを使えば、必要なものが得られるかもしれない。
以下は、IPを持つように構成されているインターフェイスのみを出力します。
ifconfig | grep "inet.*broadcast"
ifconfig en0 | grep status
これは、イーサネット接続en0のステータスを示します。
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2
どのように機能するか