use strict; use warnings; use Data::Dumper; my ($Rec,$pc_name); while () { $pc_name = $1, next if (/(port-channel \d+)$/); $Rec->{$pc_name}->{$1} = $2 if (m|(fc\d+/\d+)\s+\[(\w+)\]|); } for my $data (keys %{$Rec}) { print "\n$data \n"; for my $data2 (keys %{$Rec->{$data}}) { print "\t$data2 : \n"; } } __DATA__ port-channel 1 Administrative channel mode is on Operational channel mode is on Last membership update succeeded First operational port is fc1/5 2 ports in total, 2 ports up Ports: fc2/5 [up] fc1/5 [up] * port-channel 3 Administrative channel mode is on Operational channel mode is on Last membership update succeeded First operational port is fc1/1 1 port in total, 1 port up Ports: fc1/1 [up] *