#!/usr/bin/perl use strict; use warnings; use Data::Dump 'pp'; my %hash = (); my $level = 0; my $key; while (){ next unless /\S/; my ($proc,$data) = split ':\s+',$_,2; if ($level == 0){ $key = $proc; } else { push @{$hash{$key}},$data if (defined $data); } ++$level if /{/; --$level if /}/; } pp \%hash; __DATA__ [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: UDT{ [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line2: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line3: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line4: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line5: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line6: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Rx: line7: data } [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: UDT{ [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line10: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line11: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line12: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line13: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line14: data [ 11] 25/2/2017-19:02:06.980 proces_name thanos-Tx: line15: data }