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 -4仅显示 IPV4 地址。注意更简单的脚本,它已经排除了环回地址:

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。这是一种使用方法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 回答
7

只需使用该标志hostname,您就可以获得所有 IP 地址的列表。-I

IE

$ hostname --all-ip-addresses || hostname -I
10.10.85.100 10.20.85.100 10.30.85.100

然而

$ hostname --ip-address || hostname -i
::1%1 127.0.0.1

Centos7 (k3.10.0)

于 2016-12-11T07:01:57.077 回答
1

这是一个类似的脚本,用于我测试过的获取 IP 地址范围的内容,但速度很慢 - 有人可能会给出提示,如何加速?(这里的 ip-range 是获取所有线路的示例,似乎在温哥华和韩国之间):

#!/bin/bash

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 回答
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 回答
0

使用 grep -v 忽略 127.0.0.1

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

使用 sed 编辑掉“地址:”

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 回答
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

如果它只是你想删除的“地址:”这个词,我会使用sed而不是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

看到人们使用 sed 和 awk 而不是 perl,我总是很惊讶。

但首先,将 grep 和 awk 与一个额外选项一起使用,请随意:

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

用 perl 替换 awks:

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

我想向您介绍一个名为OSQuery的 Facebook 命令行工具,它可以帮助您通过进行类似 SQL 的查询来获取系统信息。例如,对于您的情况,您应该输入;

osquery> select * from interface_addresses; 

哪个会输出类似的东西;

interface = wlan0
       address = 192.168.0.101
          mask = 255.255.255.0
     broadcast = 192.168.0.255
point_to_point = 

我发现它更加整洁和方便。

于 2017-05-19T11:19:20.650 回答
-1
ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2
于 2012-09-21T03:36:51.587 回答