我正在尝试编写一个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 ?
正则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] 举报,一经查实,本站将立刻删除。