web-dev-qa-db-ja.com

ifconfigを解析して、Bashを使用してIPアドレスのみを取得します

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に取り組んでいます。

どうすればこれを完了できますか?

14
Fernando Retimo

まあ、何時間も苦労した後、私は最終的にそれを正しくしました:

ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

最後に欠けていたのは、リストからIPアドレスのパターンをgrepしただけです。

8
Fernando Retimo

ここでは次の両方が機能します(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}'
23
Etan Reisner

Eth0の場合、次のように動作します。同じロジックで微調整してみてください。

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'  
12
JSR

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
7
slm

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

3
Baskar

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

楽しい。

3
Mike Q

Bashで移植性のないifconfig解析を行う必要はありません。 Pythonのささいなワンライナーです。

python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
2
John Zwinck

これを試すこともできます

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:~$
2

「inet6」ではなく「inet」だけを探している場合、これは私のために機能します:

/usr/bin/ifconfig eth0 | grep --Word-regexp inet | awk '{print $2}'

「--Word-regexp」は、grepがWord全体を「inet」で検索し、単語の一部に一致しないようにします。つまり、「inet」は「inet6」に一致しません。 。

1
Jonathan Le

これは私のために働く:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

0
user3396065

使用する:

ifconfig enops3 | greb broadcast | cut -d " " -f10

どこ enops3はインターフェース名です。

0

このコードは、すべてのネットワーク接続(ループバックを除く)のIPアドレスを出力し、mostOS XとLinuxバージョン

次のようなマシンで実行されるスクリプトに特に役立ちます。

  • アクティブなネットワークアダプターが不明です。
  • wi-Fi接続とイーサネット接続を切り替えるノートブック、および
  • 複数のネットワーク接続を持つマシン。

スクリプトは次のとおりです。

/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

ノート:

  • 「キャスト」で「ifconfig」をフィルタリングします。これには、ほとんどのOS XおよびLinuxバージョンで動作しながら、ループバックアドレスを除外するという追加の効果があります。
  • 最終的な「カット」機能は、Linuxで適切に機能するために必要ですが、OS Xでは必要ありませんが、OS Xの結果には影響しません。したがって、移植性のために残されています。
0
azrobbo

JSRに似ていますが、awkcutが逆順です。

my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
0
Arun

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 ' '
0
Geograph

いくつかの解決策を試した後、私はこれが最も便利だと思います、これをエイリアスに追加します:

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

0
Shadycorp

patch's answerを取り、それをもう少し一般的にする、

つまり、最初の桁まですべてをスキップします。

ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'

またはさらに良い:

ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'

  • 最後にあるprint部分に注意してください-$ 2から$ 1に変更されます。

Perl正規表現の使用:

ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'

説明:grep -oPは、Perl正規表現を使用して完全一致を検索します。
「トリッキーな」部分は正規表現そのものです。
1。 (?<= inet addr:)は、文字列inet addr:は、探しているものの左側です。
2。 [^ ]+(^の後のスペースに注意してください)-最初の空白まですべてを探すことを意味します-私たちの場合はIPアドレスです。

0
AK75