in reply to Need help in data processing
If I understand your question correctly, your problem lies with the fact that your log entry sometimes breaks over two lines between the date and the time. Simply reading line by line will not cater for this; you have to detect whether the entry has gone onto a second line and do another readline inside the loop if so.
use strict; use warnings; open my $logFH, q{<}, \ <<EOD or die qq{open: <<HEREDOC: $!\n}; Script /opt/OV/bin/OpC/agtinstall/inst.sh invoked by root at 02/25/11 14:36:48 Other stuff here Script /opt/OV/bin/OpC/agtinstall/inst.sh invoked by root at 02/25/11 +14:36:48 more stuff and more Script /opt/OV/bin/OpC/agtinstall/inst.sh invoked by root at 02/25/11 14:36:48 more guff EOD my $rxDate = qr{(?x) ( (?:\d\d/){2}\d\d ) }; my $rxTime = qr{(?x) ( (?:\d\d:){2}\d\d ) }; while ( defined( my $line = <$logFH> ) ) { next unless $line =~ m{(?x) ^ Script \s \S+ \s invoked \s by \s root \s at \s $rxDate (?: \s $rxTime )? }; my $date = $1; my $time = defined $2 ? $2 : do { defined( $line = <$logFH> ) or die qq{Unexpected EOF\n}; $line =~ $rxTime ? $1 : q{No time found}; }; my $timestamp = join q{ }, $date, $time; print qq{Timestamp: $timestamp\n}; } close $logFH or die qq{close: <<HEREDOC: $!\n};
The output.
Timestamp: 02/25/11 14:36:48 Timestamp: 02/25/11 14:36:48 Timestamp: 02/25/11 14:36:48
I hope I have understood correctly and that this is helpful.
Cheers,
JohnGG
|
|---|