回答:
これをファイルに保存してから実行します bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
IPアドレスを示す数字のみを取得するためのより正確な方法:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
更新:これがうまくいかない場合は、他の答えを試してください
grep "inet"
別のオプションを提供するために、ip addr
次のコマンドを使用してIPアドレスを取得できます。
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
に関する情報を表示します eth0
grep "inet\b"
IPv4アドレスを持つ行のみを表示します(IPv6アドレスが必要な場合は、に変更します"inet6\b"
)awk '{print $2}'
ipaddress / maskがある2番目のフィールドに印刷します。例 172.20.20.15/25
cut -d/ -f1
IPアドレス部分のみを使用します。スクリプト内:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
/programming//a/14910952/1695680から取得
hostname -i
ただし、ローカルIPアドレス(127.0.0.1)が返される場合があるため、次を使用し、フィルタリングする必要があります。
hostname -I
ホスト名のマンページから:
-i, --ip-address
ホスト名のネットワークアドレスを表示します。これは、ホスト名を解決できる場合にのみ機能することに注意してください。このオプションの使用は避けてください。代わりにhostname --all-ip-addressesを使用してください。
-I, --all-ip-addresses
ホストのすべてのネットワークアドレスを表示します。このオプションは、すべてのネットワークインターフェースで設定されたすべてのアドレスを列挙します。ループバックインターフェイスとIPv6リンクローカルアドレスは省略されています。オプション-iとは異なり、このオプションは名前解決に依存しません。出力の順序について何も仮定しないでください。
ip addr show label 'enp*'
良く、私は迷惑な解析、のようなものであるip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
か、かなり缶仕事...
@ markus-lindbergの応答は私のお気に入りです。-o -4
ipのフラグに追加すると、より簡単に解析可能な(一貫した)出力が得られます。
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
は--oneline
、まさにこのような状況で役立つことを意味します。-4
他のすべての応答が暗示するものであるIPv4アドレスに制限するために追加されます。
ip
フラグが大好きです。cut
高度なawk
ウィザードip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
について学んだ後に「発見」awk
し、パイプラインのコマンド数を最小限に抑えることが好きです。いずれにしても素晴らしい提案。
ここにonelinersがあります.....
Awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
上記のawkコマンドのsplit関数は、区切り文字に基づいて2番目の列を分割し、分割:
された値を連想配列に格納しa
ます。したがってa[2]
、2番目の部分の値を保持します。
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
基本的なsedでは\(...\)
、キャラクターをキャプチャするために使用されるキャプチャグループと呼ばれます。後方参照により、これらのキャプチャされた文字を参照できます。\([^[:space:]]\+\)
任意の文字をキャプチャしますが、スペースは1回以上キャプチャしません。
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
前に一致した文字を最後の印刷から破棄し、\S+
1つ以上の非スペース文字に一致します。
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
inet addr:
文字列の横にある1つ以上の非スペース文字がキャプチャされ、最後にキャプチャされた文字のみが印刷されます。
使用する必要がありますip
(の代わりにifconfig
)現在、維持されており、おそらく最も重要なのはスクリプトの目的であり、一貫した解析可能な出力を生成します。以下は、いくつかの同様のアプローチです。
イーサネットインターフェイスのIPv4アドレスが必要な場合eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
スクリプトとして:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
上記で生成された出力はCIDR表記です。CIDR表記が不要な場合は、削除できます。
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
IMHOが「最もエレガント」な別のオプションは、指定されたリモートホスト(この場合は8.8.8.8)への接続に使用されるインターフェースのIPv4アドレスを取得します。この答えの@gatoatigradoの礼儀:
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
スクリプトとして:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
これは、単一のインターフェースを持つホスト上で完全に機能しますが、複数のインターフェースやルート仕様を持つホスト上でもより有利に機能します。
一方でip
、私の好ましいアプローチになり、それは確かにこの猫を肌する唯一の方法ではありません。hostname
より簡単で簡潔なものを好む場合に使用する別のアプローチを次に示します。
$ hostname --all-ip-addresses | awk '{print $1}'
または、IPv6アドレスが必要な場合:
$ hostname --all-ip-addresses | awk '{print $2}'
スクリプトとして:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
この目的のために特別に設計されたnetifacesのようなpythonライブラリを使用することをお勧めします。
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
使用中のデフォルトのネットワークインターフェイスを取得します。
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
これip addr
は、置換(gsub)の代替であり、置換ifconfig
とawk
組み合わせてのみ使用します。
ifconfig eth0|grep 'inet '|awk '{print $2}'
これは通常のユーザーでも使用できます。
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
の組み合わせの代わりに二回awk
とcut
出力を解析します。次回は、他のすべての回答を最初にチェックアウトし、重複したソリューションを投稿しないようにする必要があります。ここでのこのケースでは、それが重複するのか、単に類似するのかは議論の余地があると思うので、一般的なヒントとしてそれを受け取ってください。ありがとう。
これは私が見つけることができる最短の方法です:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
$1
ネットワークインターフェイスに置き換えます。
ip -f inet
ipにinet(ipv4)ファミリの値のみを返すように指示します。
grep -Po
次の値をperl-regexとして扱い、一致する値のみを出力するようにgrepに指示します。
正規表現\K[\d.]+
は、「このポイント(\ K)までのすべてを破棄し、できるだけ多くの数値とそれに続くドットが連続して一致する」と言います。したがって、これはIPアドレスとのみ一致し、それ以降のすべて(ショートフォーム\ XXサブネットマスクを含む)を無視します。
最近では、複数のインターフェイス(ドッカーを使用する場合など)を使用し、ETHによるインターフェイスの命名はもはや標準ではありません
このコマンドを使用してIP / Maskを抽出します。
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
したがって、インターフェイスの数と名前に関係なく、GREPはMULTICASTオプションを持つ最初のインターフェイスのみを取得します。
このコマンドを使用して、マスクなしでIPのみを抽出します。
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
私はこれらのコマンドを異なるBDSとNIXで使用しますが、決して失敗しません;)
ip
、-o
オプションを使用します。
私のスクリプトでは、次のようなものを使用しています。
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
プロセスは生成されません。