¿Cómo capturar la primera dirección IP de un comando ifconfig?

9

¿Cómo capturar la primera dirección IP que proviene del ifconfigcomando?

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

Resultado Esperado:

IP=100.14.22.12
yael
fuente
3
La pregunta ha sido respondida, ya sea usando awk o grep / cut, etc. Pero todavía es una mala idea en general usar y grep de ifconfig. ip es más adecuado y mejor soportado en las versiones modernas de Linux
Pedro
1
Esto suena como un problema XY. ¿Qué información realmente quieres? ¿La principal dirección IP de la máquina con conexión a la red? ¿Alguna dirección IP de la máquina con conexión a la red? ¿La dirección IP del primer adaptador de red? Cualquier dirección IP, no importa cuál sea? Probablemente exista una forma más directa, precisa y portátil de obtener la información que necesita.
alex.forencich

Respuestas:

20

Es mejor evitar el uso ifconfigpara obtener una dirección IP en una secuencia de comandos que está en desuso en algunas distribuciones (por ejemplo, CentOS y otras, ya no la instala por defecto).

En otros sistemas, la salida de ifconfig varía de acuerdo con el lanzamiento de la distribución (por ejemplo, la salida / espaciado / campos de ifconfigdifiere de Debian 8 a Debian 9, por ejemplo).

Para obtener la dirección IP con ip, de manera similar, está preguntando:

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

O mejor aún:

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

O, como preguntas "IP ="

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

Adaptando descaradamente la idea de @Roman

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

Salida normal:

 $ 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

De man ip:

-o, -oneline genera
cada registro en una sola línea, reemplazando los avances de línea con el carácter '\'. Esto es conveniente cuando desea contar registros con wc (1) o grep (1) la salida.

Vea un ejemplo de por qué ifconfigno se recomienda: BBB: `bbb-conf --check` que muestra las direcciones IP como` inet` - ifconfig woes

Para entender por qué ifconfigestá saliendo, vea Diferencia entre los comandos 'ifconfig' e 'ip'

ifconfiges de net-tools, que no ha podido mantenerse completamente al día con la pila de red de Linux durante mucho tiempo. También sigue usando ioctl para la configuración de la red, que es una forma fea y menos poderosa de interactuar con el núcleo.

Alrededor de 2005 se introdujo un nuevo mecanismo para controlar la pila de red: los sockets de netlink.

Para configurar la interfaz de red iproute2se utiliza ese mecanismo de socket de enlace de red dúplex completo, a la vez que se ifconfigbasa en una llamada al sistema ioctl.

Rui F Ribeiro
fuente
Prefiero no establecer eth0 como predeterminado porque este nombre cambia en las máquinas, ¿podemos proporcionar una sintaxis flexible
Yael
@yael cambiado, sacó eth0. Sin embargo, a Roman le fue mejor que a mí imprimir el "IP =" dentro awk. Demasiada capacidad mental para mí, aún despertando. Evite ifconfig, no tiene futuro, y la posición de la dirección IP cambia, hay al menos dos versiones / implementaciones diferentes (?) Para Linux que conozco.
Rui F Ribeiro
Solo para información, en las versiones más recientes de iproute2 (por ejemplo: no en CentOS7 ni Debian8) ip puede tomar un -briefparámetro y su salida se vuelve más fácil de analizar ( 2015-08-31 : git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB también -o mientras uso ayuda, gracias, lo comprobará
Rui F Ribeiro
1
Ah, no sabía sobre lo -oque de hecho parece útil para los guiones
AB
6

Awk solución:

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

Salida de muestra:

IP=10.0.2.15
RomanPerekhrest
fuente
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
fuente
1
mira esto:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
¿Por qué estás buscando la IP localhost 127.0.0.1?
Jeff Schaller