Bashrcファイルを編集して、実行する「myip」という単純な関数を作成します。ご想像のとおり、関数myipは、マシンの内部IPアドレスのみを出力します。
私が働いている限り、これはスクリプトです:
ifconfig en1 | awk '{ print $2}' | sort
これは私のこの出力を得ました:
10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active
私はMac OS Xに取り組んでいます。
どうすればこれを完了できますか?
まあ、何時間も苦労した後、私は最終的にそれを正しくしました:
ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
最後に欠けていたのは、リストからIPアドレスのパターンをgrepしただけです。
ここでは次の両方が機能します(CentOS 5)。
ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'
ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'
OS Xの場合( v10.11 (El Capitan)少なくとも):
ifconfig en0 | awk '$1 == "inet" {print $2}'
Eth0の場合、次のように動作します。同じロジックで微調整してみてください。
ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
awk
を使用して、inet
行の選択とIPアドレスの解析の両方を次のように実行できます。
$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1
上記の例では、デバイスハンドルを置き換えますeth0
in docker0
。また、純粋な [〜#〜] awk [〜#〜] 実装が必要な場合は、次のように「切り取り」を行うことができます。
$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
Ifconfigの解析とは別に、IPアドレスを取得する別の簡単な方法があります。
hostname -I -I, --all-ip-addresses all addresses for the Host -i, --ip-address addresses for the hostname
参照: http://linux.die.net/man/1/hostname
例:
[ec2-user @ terraform〜] $ホスト名-I
10.10.10.10
BASH4 +を使用したIPv4の例
例1、ホスト名を使用:
hostname -I|cut -d" " -f 1
例2デバイスは既知であり(変更されることはありません):
ifconfig ens5 | grep "inet" | awk '{print $2}' | sed 's/[^0-9.]*//g'
例、デバイスを使用しないでください(例:eth0、eth1、enp0s23、またはwpxxx):
ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF " IP: "$2}'
例4、ネットワークIPアドレスが必要:
wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1
楽しい。
Bashで移植性のないifconfig解析を行う必要はありません。 Pythonのささいなワンライナーです。
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
これを試すこともできます
user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
user@linux:~$
出力
user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$
Ifconfigの出力は、Linuxのバージョンによって異なる場合があることに注意してください。したがって、それに応じてスクリプトを変更することもできます。
ところで、これは私のifconfig出力です
user@linux:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:10
inet addr:192.168.1.1 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112 errors:0 dropped:0 overruns:0 frame:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14616 (14.2 KiB) TX bytes:17776 (17.3 KiB)
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:11
inet addr:10.0.1.1 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user@linux:~$
「inet6」ではなく「inet」だけを探している場合、これは私のために機能します:
/usr/bin/ifconfig eth0 | grep --Word-regexp inet | awk '{print $2}'
「--Word-regexp」は、grepがWord全体を「inet」で検索し、単語の一部に一致しないようにします。つまり、「inet」は「inet6」に一致しません。 。
これは私のために働く:ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
使用する:
ifconfig enops3 | greb broadcast | cut -d " " -f10
どこ enops3
はインターフェース名です。
このコードは、すべてのネットワーク接続(ループバックを除く)のIPアドレスを出力し、mostOS XとLinuxバージョン。
次のようなマシンで実行されるスクリプトに特に役立ちます。
スクリプトは次のとおりです。
/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2
これは、次のようなスクリプト内の変数に割り当てることができます。
myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)
スクリプトは、ループを使用して結果を処理することにより、可能な複数のアドレスを処理できます。
if [[ -n $myip ]]; then
count=0
for i in $myip; do
myips[count]=$i # Or process as desired
((++count))
done
numIPaddresses=$count # Optional parameter, if wanted
fi
ノート:
JSRに似ていますが、awk
とcut
が逆順です。
my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
VDS/VPSでも機能するコード:
ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1
または
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
いくつかの解決策を試した後、私はこれが最も便利だと思います、これをエイリアスに追加します:
alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'
出力は次のようになります。
shady@Shadys-MacBook-Pro:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255
patch's answerを取り、それをもう少し一般的にする、
つまり、最初の桁まですべてをスキップします。
ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'
またはさらに良い:
ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'
Perl正規表現の使用:
ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'
説明:grep -oPは、Perl正規表現を使用して完全一致を検索します。
「トリッキーな」部分は正規表現そのものです。
1。 (?<= inet addr:)
は、文字列inet addr:
は、探しているものの左側です。
2。 [^ ]+
(^の後のスペースに注意してください)-最初の空白まですべてを探すことを意味します-私たちの場合はIPアドレスです。