ifconfig
の面倒な解析なしに、プログラムでIPアドレスを抽出する簡単な方法はありますか? sed
を使用してそれを行う単純なコマンド出力処理は気にしませんが、/etc
からの複数行ファイルを処理しません。私がやろうとしていることは、挨拶メッセージにホストのIPアドレスを表示するように.bashrc
を変更することです。私はUbuntu 12.04
を使用していますが、これはディストリビューション固有のものではないと考えているため、Ubuntuフォーラムの代わりにここに投稿することにしました。
NICデバイスハンドル
以下の例では、ネットワークインターフェイスがwlan0
という名前のワイヤレスカードであると想定しています。特定の状況に合わせて、例のこのビットを調整してください。たとえば、有線のNIC=カードの場合は、おそらくeth0
です。
IPv4 インターネットプロトコルバージョン4)
また、これらの例はIPv4アドレスを返しています。ほとんどの人が「IPアドレス」として識別する「ドット付きクワッド」。
例えば:
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
IPv6-(インターネットプロトコルバージョン6)
システムがIPv6をサポートするように構成されている場合、ifconfig
出力に「ドット付きクワッド」とIPv6 IPアドレスの両方が表示されます。
例えば:
inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
以下のコマンドはこれを明示的に無視しますが、代わりにこの情報を取得するために非常に簡単に適応できます。
ifconfig
を使用)これを行うには多くの方法があります。たとえば、次のawk
スクリプトを使用して、ワイヤレスLANのIPアドレスを解析できますNIC(wlan0):
$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20
これを行うと、よりコンパクトにすることができます。
$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20
Perl
を使用して行うこともできます。
$ ifconfig wlan0 | Perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20
Perlの例は、可能な限りコンパクトです。
これを行う方法は他にも無数にあります。これらは、開始するためのいくつかの例にすぎません。
いくつかの追加のメモとコメント。 @StephaneChazelasは、grep
を使用したさらにコンパクトなバージョンがあることを示しました。
$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20
このソリューションは、新しいバージョンのgrep
の機能を利用してPCRE(Perl正規表現)を利用し、さらに-o
スイッチを使用して正規表現に一致するものだけを返します。
ip
を使用)コメントでも述べたように、ifconfig
は、最初のアドレスのみを返すため、ネットワークデバイスに複数のIPアドレスが割り当てられているシステムで使用するのは面倒です。したがって、これらの状況ではip
コマンドを使用することをお勧めします。
例えば:
$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
ip
に、特定のネットワークインターフェースのIPv4情報のみを表示するように指示することもできます。この場合は、wlan0
という名前のインターフェースのみを調べています。
$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
$ hostname -I
例えば:
$ hostname -I
192.168.1.18
情報。マンページから:
http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname
これは「ip」を使用した別の例ですが、これは、デバイスが有線イーサネットと時々WiFiなどの異なるインターフェースに接続されている場合に、よりうまく機能します。また、「grep」や「Perl」の代わりに「sed」を使用しました。
これにより、インターネットへのルートを持つソースIPが検出されます。または、いずれにしてもGoogleのDNSに。
ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'