#!/usr/bin/perl -w use strict; use Data::Dumper; my %backups; my @important_keys = qw(backup-status backup-set backup-date backup-time ERROR); # this is how to translate the array into something that could # be used for a special sort order, but I don't think you will # need to do that. my $i=1; my %important_order = map{$_ => $i++} @important_keys; while () { next if (/^\s*$/); #skip blank lines chomp; my ($date, $backupset , $parm , $value) = parseline($_); if ($value) { $backups{$backupset}{$parm} = $value; } } #print Dumper \%backups; foreach my $set (sort keys %backups) { print "\n*** backup set: $set ***\n"; #method 1 foreach my $parm (sort keys %{$backups{$set}}) { printf " %-15s = %s \n", $parm, $backups{$set}{$parm} if $important_order{$parm}; } #method 2 # foreach my $parm (@important_keys) # { # printf " %-15s = %s \n", $parm, $backups{$set}{$parm} # if $backups{$set}{$parm}; # } } sub parseline { my $line = shift; my ($date, $rest) = $line =~ m/(^.*\d{4}):(.*)/; my ($backupset, $msg) = split(/backup:INFO:/, $rest); $backupset =~ s/:\s*$//; #trimming some unwanted thing like ':' is ok $backupset =~ s/^\s*backup\.//; #more than one step is just fine too! my ($parm, $value) = $msg =~ m/\s*(.*)=\s*(.*)\s*/; $parm ||= $msg; #if match doesn't happen these will be undef $value ||=""; #so this trick makes sure that they are defined. return ($date, $backupset, $parm, $value); } =method 1 prints: *** backup set: set1_lvm *** backup-date = 20100816000003 backup-set = backup.set1_lvm backup-status = Backup succeeded backup-time = 01:59:04 *** backup set: set2_lvm *** backup-date = 20100815200003 backup-set = backup.set2_lvm *** backup set: set2_lvm_lvm *** backup-status = Backup succeeded backup-time = 04:33:12 =method 2 prints: *** backup set: set1_lvm *** backup-status = Backup succeeded backup-set = backup.set1_lvm backup-date = 20100816000003 backup-time = 01:59:04 *** backup set: set2_lvm *** backup-set = backup.set2_lvm backup-date = 20100815200003 *** backup set: set2_lvm_lvm *** backup-status = Backup succeeded backup-time = 04:33:12 =cut #### __DATA__ Sun Aug 15 20:00:03 2010: backup.set2_lvm:backup:INFO: START OF BACKUP Sun Aug 15 20:00:04 2010: backup.set2_lvm:backup:INFO: backup-set=backup.set2_lvm Sun Aug 15 20:00:04 2010: backup.set2_lvm:backup:INFO: backup-date=20100815200003 Sun Aug 15 20:00:04 2010: backup.set2_lvm:backup:INFO: backup-type=regular Sun Aug 15 20:00:04 2010: backup.set2_lvm:backup:INFO: backup-date-epoch=1281927603 Sun Aug 15 20:00:04 2010: backup.set2_lvm:backup:INFO: backup-directory=/home/backups/backup.set2_lvm/20100815200003 Mon Aug 16 00:00:04 2010: backup.set1_lvm:backup:INFO: START OF BACKUP Mon Aug 16 00:00:05 2010: backup.set1_lvm:backup:INFO: backup-set=backup.set1_lvm Mon Aug 16 00:00:05 2010: backup.set1_lvm:backup:INFO: backup-date=20100816000003 Mon Aug 16 00:00:05 2010: backup.set1_lvm:backup:INFO: backup-type=regular Mon Aug 16 00:00:05 2010: backup.set1_lvm:backup:INFO: backup-date-epoch=1281942003 Mon Aug 16 00:33:15 2010: backup.set2_lvm_lvm:backup:INFO: last-backup=/home/backups/backup.set2_lvm_lvm/20100814200003 Mon Aug 16 00:33:15 2010: backup.set2_lvm_lvm:backup:INFO: backup-size=424.53 GB Mon Aug 16 00:33:15 2010: backup.set2_lvm_lvm:backup:INFO: backup-time=04:33:12 Mon Aug 16 00:33:15 2010: backup.set2_lvm_lvm:backup:INFO: backup-status=Backup succeeded Mon Aug 16 00:33:15 2010: backup.set2_lvm_lvm:backup:INFO: Backup succeeded Mon Aug 16 00:33:16 2010: backup.set2_lvm_lvm:backup:INFO: END OF BACKUP Mon Aug 16 01:59:07 2010: backup.set1_lvm:backup:INFO: last-backup=/home/backups/backup.set1_lvm/20100815000006 Mon Aug 16 01:59:07 2010: backup.set1_lvm:backup:INFO: backup-size=187.24 GB Mon Aug 16 01:59:07 2010: backup.set1_lvm:backup:INFO: backup-time=01:59:04 Mon Aug 16 01:59:07 2010: backup.set1_lvm:backup:INFO: backup-status=Backup succeeded Mon Aug 16 01:59:07 2010: backup.set1_lvm:backup:INFO: Backup succeeded Mon Aug 16 01:59:09 2010: backup.set1_lvm:backup:INFO: END OF BACKUP