微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 ?

这是一个在bash中的错误吗?(向上箭头)

正则expression式来排除查找工具的单词

并行运行shell脚本

bash shell脚本函数定义中使用的括号“f(){}”是什么? 与使用“function”关键字不同吗?

取消在bash中的逆向search失败,但保持我input的内容

bash – 仅当相应的文本文件存在时才打开图像

列出目录中每个文件的前几行

Linux Bash脚本代理variables

Shell脚本来检查进程是否已经运行,如果是,退出

lockfile-create在bash脚本中不起作用

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

仅列出addr:

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

列表设备和地址:

ifconfig | awk -v RS="nn" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1),6); if (address != "127.0.0.1") printf "%st%sn",$1,address }'

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐