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


9

如何捕获来自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

3
这个问题已经通过使用awk或grep / cut等方式得到了回答。但是,从ifconfig中使用grep和grep通常仍然不是一个好主意。ip更适合现代Linux版本并得到更好的支持。
Pedro

1
这听起来像是XY问题。您真正想要什么信息?机器的主要面向网络的IP地址?机器的任何面向网络的IP地址吗?第一个网络适配器的IP地址?任何IP地址都无所谓吗?可能有更直接,准确和可移植的方式来获取您所需的信息。
alex.forencich

Answers:


20

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

在其他系统中,ifconfig的输出根据发行版本的不同而有所不同(例如ifconfig,Debian 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系统调用。


我不希望将eth0设置为默认值,因为此名称在计算机上会更改,我们能否提供灵活的语法
yael

@yael更改了,取出了eth0。但是Roman比我在里面打印“ IP =”更好awk。对我来说,太多的智力仍在醒来。避免ifconfig,它没有前途,并且IP地址的位置发生了变化,我知道至少有两个不同的Linux版本/实现(?)。
Rui F Ribeiro

只是为了提供信息,在较新版本的iproute2上(例如:不在CentOS7或Debian8上),ip可以使用-brief参数并且其输出变得更易于解析(2015-08-31:git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/...
AB

@AB还-o,因为我使用帮助,谢谢,将对其进行检查
Rui F Ribeiro

1
啊,我不知道-o哪个脚本确实确实有用
-AB的


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

1
看到这个:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro

1
您为什么要为本地IP 127.0.0.1通用?
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.