如何从 ifconfig 命令捕获第一个 IP 地址?

如何从 ifconfig 命令捕获第一个 IP 地址?

如何捕获来自ifconfig命令的第一个IP地址?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

预期结果:

IP=100.14.22.12

答案1

最好避免ifconfig在脚本中使用它来获取 IP 地址,因为它在某些发行版中已被弃用(例如 CentOS 和其他发行版,默认情况下不再安装它)。

在其他系统中,ifconfig 的输出根据发行版的不同而不同(例如,ifconfigDebian 8 到 Debian 9 的输出/间距/字段不同)。

要使用 获取 IP 地址ip,您可以以类似的方式询问:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

或者更好的是:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

或者,正如您所问的“IP =”

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

无耻地改编@Roman的想法

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

正常输出:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

man ip

-o, -oneline
将每个记录输出在一行上,用“\”字符替换换行符。当您想要使用 wc(1) 或 grep(1) 输出对记录进行计数时,这很方便。

请参阅一个示例来说明为什么ifconfig不建议这样做:BBB:“bbb-conf --check”将 IP 地址显示为“inet” - ifconfig 问题

要了解为什么ifconfig即将退出,请参阅“ifconfig”和“ip”命令之间的区别

ifconfig来自net-tools,它长期以来一直无法完全跟上Linux网络堆栈的步伐。它还仍然使用 ioctl 进行网络配置,这是一种丑陋且功能较弱的与内核交互的方式。

2005 年左右,引入了一种用于控制网络堆栈的新机制 - netlink 套接字。

配置网络接口iproute2利用全双工 netlink 套接字机制,同时ifconfig依赖 ioctl 系统调用。

答案2

Awk解决方案:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

示例输出:

IP=10.0.2.15

答案3

ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}

相关内容