#!/usr/bin/perl -w use strict; while () { next if (/^\s*$/); #skip blank lines chomp; my ($date, $backupset , $parm , $value) = parseline($_); # the idea is to concentrate the parsing of the line and its # associated "regex-foo" into one place. I think rest of your # code can use simple eq or ne comparisons. print "$date\n"; print " BACKUP SET = $backupset\n"; if ($value eq "") { print " SINGLE TOKEN: $parm\n";} else {print " PAIR: $parm IS $value\n";} } 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/(.*)=(.*)/; $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); } =prints... Sun Aug 15 20:00:03 2010 BACKUP SET = set2_lvm SINGLE TOKEN: START OF BACKUP Sun Aug 15 20:00:04 2010 BACKUP SET = set2_lvm PAIR: backup-set IS backup.set2_lvm Sun Aug 15 20:00:04 2010 BACKUP SET = set2_lvm PAIR: backup-date IS 20100815200003 Sun Aug 15 20:00:04 2010 BACKUP SET = set2_lvm PAIR: backup-type IS regular Sun Aug 15 20:00:04 2010 BACKUP SET = set2_lvm PAIR: backup-date-epoch IS 1281927603 Sun Aug 15 20:00:04 2010 BACKUP SET = set2_lvm PAIR: backup-directory IS /home/backups/backup.set2_lvm/20100815200003 Mon Aug 16 00:00:04 2010 BACKUP SET = set1_lvm SINGLE TOKEN: START OF BACKUP Mon Aug 16 00:00:05 2010 BACKUP SET = set1_lvm PAIR: backup-set IS backup.set1_lvm Mon Aug 16 00:00:05 2010 BACKUP SET = set1_lvm PAIR: backup-date IS 20100816000003 Mon Aug 16 00:00:05 2010 BACKUP SET = set1_lvm PAIR: backup-type IS regular Mon Aug 16 00:00:05 2010 BACKUP SET = set1_lvm PAIR: backup-date-epoch IS 1281942003 Mon Aug 16 00:33:15 2010 BACKUP SET = set2_lvm_lvm PAIR: last-backup IS /home/backups/backup.set2_lvm_lvm/20100814200003 .... and so forth .... =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