10

bashサーバー上のすべての IP アドレスを取得するスクリプトを作成しようとしています。このスクリプトは、すべての主要なディストリビューションで動作するはずです。ここに私が持っているものがあります:

ifconfig | grep 'inet addr:' | awk {'print $2'}

その結果:

addr:10.1.2.3
addr:50.1.2.3
addr:127.0.0.1

addr:最初にプレフィックスを削除するにはどうすればよいですか? 第二に、どのように除外でき127.0.0.1ますか?

4

12 に答える 12

15

ifconfigによって廃止されましたip-oまた、解析しやすい出力を書き込むフラグもあります。ip -4IPV4 アドレスのみを表示するために使用します。単純なスクリプトに注意してください。すでにループバック アドレスが除外されています。

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}'

または、ネットワークが必要ない場合:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}'
于 2012-09-27T14:47:16.183 に答える
7

の必要はありませんgrep。を使用する 1 つの方法を次に示しawkます。

リストのみのアドレス:

ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'

デバイスとアドレスを一覧表示します。

ifconfig | awk -v RS="\n\n" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1), 6); if (address != "127.0.0.1") printf "%s\t%s\n", $1, address }'
于 2012-09-21T03:40:34.393 に答える
1

これは、いくつかの以前の回答とコメントの要約に過ぎません。サンプル出力が含まれています。

IP を一覧表示するには:

使用ip:

(IPv4 およびグローバルに限定)

$ /sbin/ip -4 -o addr show scope global | awk '{gsub(/\/.*/,"",$4); print $4}'
192.168.82.134
138.225.11.92
138.225.11.2

使用ifconfig:

(127.0.0.1を除く)

$ /sbin/ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
192.168.82.134
138.225.11.92
138.225.11.2

IP をホスト名にマップするには、この回答を参照してください。

于 2014-12-18T23:46:42.487 に答える
1

これは、アドレスの IP 範囲を取得するために私がテストしたものと同様のスクリプトですが、遅いです - 誰かがヒントを与えるかもしれません。(ここでの ip-range は、バンクーバーと韓国の間で稼働しているように見えるすべての回線を取得するための例です):

#!/ビン/バッシュ

for ip in {209..210}.{125..206}.{5..231}.{65..72} # 209.126.230.71 と 210.205.6.66 の間の任意の IP

行う

printf ' === %s ===\n' "$ip"

whois "$ip" >> /home/$user/test001.txt

終わり

ここでこれがあまりにも些細なことや間違いである場合は、単に回答するかコメントしてください。

このスクリプトは、終了するまで約 5 ~ 8 時間続きます。

于 2013-10-09T19:23:40.783 に答える
0

削除したいのが「addr:」単語だけの場合は、 likesedの代わりに使用しますawk

ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://'
于 2015-03-31T08:09:45.227 に答える
0

これは非常にトリッキーな解決策ですが、うまくいきます:

ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}'

出力:

eth0: 192.168.0.1/24

さらに良いことに:

ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}' | perl -i -pe "s/:\n/: /g;" -pe "s/\/[\d]+$//"

出力:

eth0: 192.168.0.1

私はそれをチェックできるいくつかの非ループバックインターフェースを備えたマシンを持っていません。調査結果を投稿してください。

于 2015-03-31T08:02:19.253 に答える
0

perl の代わりに sed や awk を使っている人を見るといつも驚かされます。

しかし、最初に grep と awk の両方を追加のオプションとともに使用して、自由に次のことを行ってください。

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk -F: {'print $2'} | grep -v '127.0.0.1'

awks を perl に置き換えます。

ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1'

同じ perl スクリプト内の grep を置き換えます。

ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"'

そして最後に、perl の正規表現の力を利用するだけです:

ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'
于 2015-10-01T19:29:06.667 に答える
0

grep -v を使用して 127.0.0.1 を無視します

ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'

sed を使用して「addr:」を編集します。

ifconfig | grep 'inet addr:' | awk {'print $2'}  | grep -v '127.0.0.1' | sed -e 's/addr://'
于 2012-09-21T03:36:55.560 に答える
0

ifconfig | grep 'inet addr:' | awk {'print $2'} | awk 'BEGIN{FS=":"}{print $2}' | grep -v '127.0.0.1'

于 2012-09-21T03:37:12.420 に答える
-1
ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2
于 2012-09-21T03:36:51.587 に答える