Bash脚本获取所有IP地址

我正在尝试编写一个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

没有必要grep 。 这里有一个使用awk

仅列出addr:

 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 }' 

ifconfigip过时了。 它也有写输出易于解析的标志。 使用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}' 

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

 $ 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)

这是一个类似的脚本,我已经测试了一个ip地址范围,但是它很慢 – 有人可能会提示,如何加速这个? (这里的IP范围就是一个例子,让所有的线路,似乎在温哥华和韩国之间):

#!/斌/庆典

ip:{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

DONE

如果这太微不足道了或者在这里有一些错误,只需回答或评论。

这个脚本会持续5到8个小时。

这只是几个以前的答案和评论的升华。 样本输出包括在内。

要列出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映射到主机名,请参阅此答案 。

使用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://' 

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

如果它只是你想删除的“addr:”这个词,我会用sed而不是awk

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

这是一个非常棘手的解决方案,但它的工作原理:

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

我没有一个机器有几个非回送接口,我可以检查它,随时张贴您的发现。

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

但是,首先,使用grep和awk和一个额外的选项,随意只是:

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

用perl替换awk:

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

替换相同的Perl脚本中的greps:

 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"' 

我会向你介绍一个叫做OSQuery的命令行工具,它可以帮助你通过类似于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 = 

我发现更多的整洁和方便。

 ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2