I'm trying to learn as much as possible about Linux, I'm currently stuck at trying to grab specific parts of my ifconfig text display so it looks exactly like this:
eth0: inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255 wlan0: inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255I've come so close, so far i have tried about a million possible combinations but I'm close to exhausted, this is some of what i have tried.
ifconfig | head -19 | sed 'wlan0|\eth0' | awk '{print $2}' ifconfig | head -19 | egrep 'wlan0|\eth0' | awk '{print $1}' | sed '/^net/p' ifconfig | head -19 | egrep 'wlan0|\eth0|' | awk '{print $1}' ifconfig | cut -d: -f1 | awk '{print $2}' | cut -d: -f1This is as close as i have come
ifconfig | head -n 2 | cut -d: -f1; ifconfig | tail -8 | head -1 eth0 inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255 inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255I'm missing wlan0 in between 000 and xxx, Thank you for your time and effort.
My Display
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.000 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 xxxxxxxxxxxxxxxxxxxxxxx prefixlen 64 scopeid 0x20<link> ether xxxxxxxxxxx txqueuelen 1000 (Ethernet) RX packets 711634 bytes 635444016 (606.0 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 523020 bytes 98052518 (93.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 4266 bytes 735580 (718.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4266 bytes 735580 (718.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.xxx netmask 255.255.255.0 broadcast 192.168.1.255 inet6 xxxxxxxxxxxxxxxx prefixlen 64 scopeid 0x20<link> ether xxxxxxxxxxx txqueuelen 1000 (Ethernet) RX packets 2429 bytes 371836 (363.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 227 bytes 79847 (77.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0I just found a way with
ifconfig | head -n 2 | cut -d: -f1; ifconfig | tail -9 | cut -d: -f1 | head -2But I'm open to more ways if you have them
3 Answers
A proper way:
(better use ip(8) in 2018)
Using grep -P (perl's regex)
for dev in wlan0 eth0; do ip address show dev $dev | grep -oP 'inet\s+\K\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
doneUsing awk
for dev in wlan0 eth0; do ip address show dev $dev | awk -F'[ /]' '/inet /{print $6}'
doneIf you insist to use ifconfig :
for dev in wlan0 eth0; do ifconfig $dev | awk '/inet /{print $2}'
doneLast: if you need the interface name in the output :
for dev in wlan0 eth0; do ifconfig $dev | awk -vdev=$dev '/inet /{print dev, $2}'
done 0 Here is a sample of this answer of mine:
#!/bin/bash
# NAME: getIP
# Set the names of the target interfaces as array or assign the user's input
[[ -z ${@} ]] && IFACES=$(/sbin/ifconfig | sed -r '/^ .*/d; s/ .*//' | tr '\r\n' ' ') || IFACES=($@)
# Set IPv4 address match pattern
IPv4='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
# Get the IP address
for IFACE in ${IFACES[@]}; do /sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPv4}" | tr '\r\n' ' ' | \ awk -v iface="${IFACE}:" 'BEGIN{ print iface } { printf "\tinet %-16s netmask %-16s broadcast %s\n",$1, $3, $2}'
doneNote: The script is based on the output of ifconfig in Ubuntu 16.04. Usage:
$ ./getIP # Automatic mode
enp2s0: inet 192.168.100.110 netmask 255.255.255.0 broadcast 192.168.100.255
lo: inet 127.0.0.1 netmask broadcast 255.0.0.0
vmnet1: inet 192.168.201.1 netmask 255.255.255.0 broadcast 192.168.201.255
vmnet8: inet 192.168.15.1 netmask 255.255.255.0 broadcast 192.168.15.255
$ ./getIP enp2s0 # User's input mode
enp2s0: inet 192.168.100.110 netmask 255.255.255.0 broadcast 192.168.100.255 1 If you're interested in just extracting an interface address- which it appears is the main thrust of your question- you could always try the hostname command and screen-scrape its' output by piping it to awk or grep, ie:
hostname -I | awk '{print $1}'If the host is multi-homed, when using awk you can toggle the address output by changing $1 to $2, $3, etc... Note it also works with IPv6 addresses.
man hostname:
-I, --all-ip-addresses Display all network addresses of the host. This option enumerates all configured addresses on all network interfaces. The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.
Anyhoo, just another (very simple) way to grab an IP from a host.