($line =~ /(\d+)%\s+\/var\s+(\d+).*?(\d+)%\s+Interleaved\s+.*?avm\s+.*?fre\s+.*?cs\s+.*?us\s+.*?sy\s+.*?id\s+.*?(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\w+)/i) #### $line =~ /(\d+)%\s+\/var\s+(\d+).*?(\d+)%\s+Interleaved\s+.*?avm\s+.*?fre\s+.*?cs\s+.*?us\s+.*?sy\s+.*?id\s+.*?(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+.*?(\d\d):(\d\d):(\d\d)/i print "$device $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12\n"; #### use strict; use warnings; my @devices; while( my $line = ){ next unless $line =~ /^\s*logging to (\w+) is ([0-9.]+) . . ./; my %device = ( name => $1, ip => $2, partitions => [], ); do { $line = ; } until $line =~ /\S/; while( $line =~ /^(\d+)%\s+(\S+)/ ){ push @{$device{partitions}}, { name => $2, pct_used => $1 }; $line = ; } warn "Expected 'disks faults' line" unless $line =~ /disks faults/; $line = ; chomp($line); warn "Expected 'avm fre cs us sy id' line" unless $line =~ /avm fre cs us sy id/; my @cols = split ' ', $line; warn "wrong number of columns" unless scalar(@cols)==6; $line = ; chomp($line); warn "Expected numbers on '$line'" unless $line =~ /(\d+ ){5}\d+/ && $line !~ /[^0-9 ]/; my @vals = split ' ', $line; warn "wrong number of values" unless scalar(@vals)==6; @{$device{attributes}}{ @cols } = @vals; $line = ; chomp $line; warn "Expected device name on '$line'" unless $line eq $device{name}; $line = ; chomp $line; if( $line =~ /(\d\d):(\d\d):(\d\d)/ ){ @{$device{date}}{ qw/hour minute second/ } = ( $1, $2, $3 ); }else{ warn "Couldn't parse date line: '$line'"; } push @devices, \%device; } use Data::Dumper; print Dumper \@devices; exit; __DATA__ logging to device1 is 2.3.5.1 . . . 56% /var 38% / 31% Interleaved disks faults avm fre cs us sy id 504956 19880 32 3 24 72 device1 Tue Sep 9 11:26:44 ist 2005 logging to device2 is 2.3.5.1 . . . 96% /var 88% / 100% Interleaved disks faults avm fre cs us sy id 5049 198 32 3 24 72 device2 Tue Sep 5 10:26:44 GMT 2005