Using sed to extract line of a file

Ok .. This is driving me nuts. I suppose I need another set of eyes.

Example Data

interface Vlan1
 description xxxxxxxxxxxx
 ip address 192.168.1.1 255.255.255.252
 no ip redirects
 no ip proxy-arp
 ip flow ingress
 ip pim sparse-mode
 load-interval 30
!
interface Vlan2
 description xxxxxxxxxxxx
 ip address 192.168.120.106 255.255.255.252
 no ip redirects
 no ip proxy-arp
 ip flow ingress
 ip pim sparse-mode
 load-interval 30
!
interface Vlan3
 description xxxxxxxxxxxx
 ip address 192.168.201.3 255.255.255.0
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
 no ip redirects
 no ip proxy-arp
 ip pim sparse-mode
 standby 0 ip 192.168.201.1
 standby 0 timers 1 3
 standby 0 authentication baronet2
!
interface Vlan4
 description xxxxxxxxxxxx
 ip address 192.168.120.110 255.255.255.252
 no ip redirects
 no ip proxy-arp
 ip flow ingress
 ip pim sparse-mode
 load-interval 30
!
interface Vlan5
 description xxxxxxxxxxxx
 ip address 192.168.202.3 255.255.255.0
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
 no ip redirects
 no ip proxy-arp
 ip pim sparse-mode
 standby 0 ip 192.168.202.1
 standby 0 timers 1 3
 standby 0 priority 105
 standby 0 preempt

The Results I am looking for is / are :

Interface and ip helper addresses associated with that interface

interface Vlan603
  ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
 

interface Vlan604
  ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
 etc 
 etc

I thought I solved this once before .. but lost some stuff in a new work laptop transition.

Any help would be appreciated.

POP

How about

awk '/^ *interface/ {IF = $0} /helper/ {if (IF) print IF; IF = ""; print}' file
interface Vlan3
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
interface Vlan5
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194

EDIT: or, with sed ,

sed -n '/^ *interface/ { :L1; x; /helper/ p; n; }; :L2; /helper/ {H; n; bL2; }; $ bL1;' file
1 Like

grep is simple stupid, but maybe good enough?

grep -E "interface|ip helper-address" file

--- Post updated at 20:20 ---

A simple sed solution (works like the awk sample in post #2)

sed '/interface/x; /ip helper-address/!d; x; /./p; s/.*//; x' file
1 Like
$ awk -F'\n' ' $0 ~ /interface.*helper-address/ { print $1,$4, $5, $6, $7 } ' RS='!\n' OFS="\n" file
interface Vlan3
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194
interface Vlan5
 ip helper-address 192.168.228.188
 ip helper-address 192.168.97.199
 ip helper-address 192.168.133.140
 ip helper-address 192.168.152.194

Interesting separator technique, but seems to only work with GNU awk.
And, of course, the positions and amounts of the "helper-address" lines may vary...

Just another way to do the same

awk '/^interface/{i=$0}/helper/{ print ((i!=z)?i RS:z) $0 ; i=z }' yourfile