ifconfig output:
lo: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
eth0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
address: 01:02:03:04:05:06
media: Ethernet 1000baseT full-duplex
status: active
inet 192.168.0.10 netmask 0xffff0000 broadcast 192.254.255.255
inet alias 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255
inet6 fe80::0:0:0:01%eth0 prefixlen 64 scopeid 0x4
vlan01: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
vlan: 01 priority: 0 parent: eth0
address: 01:02:03:04:05:06
inet 192.168.0.11 netmask 0xfffffff0 broadcast 192.254.255.255
inet6 fe80::0:0:0:02%vlan01 prefixlen 64 scopeid 0x6
inet6 2a03:0:0:0::e1 prefixlen 64
Note, that for vlan01 there is a record 'parent: eth0'.
What I need is to get vlan01 for this particular output.
I have only sed and grep at my disposal.
Is it possible with ifconfig -a | sed '...'?
We can do that with sed:
#!/bin/sed -nf
# If it begins with anything except whitespace, trim it down to the
# bit before ":", and store that into hold space.
/^[^ ]/{
s/:.*//
h
}
# If we see "parent: eth0", then print the hold space.
/parent: eth0/{
g
p
}
With your input, this outputs vlan01 (and a newline).
Using only grep:
ifconfig | grep -B1 parent | grep -oh ^[a-z0-9]*
# -B num - Print num lines of leading context before matching lines.
# -o Print only the matched (non-empty) parts of matching lines, with each such part on a separate output line.
This outputs vlan01 for the output provided in your question. Note that my example only looks for parent. The pattern should be updated to reflect what you want - parent: eth0or other.
User contributions licensed under CC BY-SA 3.0