From: "John W. Krahn" <[EMAIL PROTECTED]>
> Tim Martin wrote:
> >
> > My new manager wants me to learn perl and start with understanding
> > logs files from 50 plus servers. I hope I have sent this message to
> > the correct perl form. I have a sample of the logs below that need
> > to be fixed using perl. Any ideas or suggestion will be helpful.
> >
> > ============= Start of log sample =============
> >
> > 1. REMOVE ALL WHITE SPACE GREATER THEN ONE.
> >
> > [snip]
> > ====================================================================
> > =======
> >
> > 2. ENSURE EACH LINE IN THE LOG START WITH A DATE AND TIME
> > REMOVE THE CARRIAGE RETURN AND LINE FEED
> > INSERT ONE WHITE SPACE
> >
> > [snip]
> > ====================================================================
> > =======
> >
> > 3. ENSURE EACH LINE IN THE LOG START WITH A DATE AND TIME
> > REMOVE THE CARRIAGE RETURN AND LINE FEED
> > INSERT ONE WHITE SPACE
> > REMOVE ALL BLANK LINES FROM LOGS
> >
> > [snip]
> > ============= End of log sample =============
>
>
> perl
> -lane'eof||m!^\d{4}/\d\d/\d\d\s+\d\d:\d\d:\d\d\s!?((@X&&print"@X"),@X=
> @F):push@X,@F' logfiles*
Wow :-)
It's very short and all, but ... not very readable :-)
Let's write it as an ordinary program:
#!perl -w
use strict;
sub CleanupLog {
my ($from_file, $to_file) = @_;
open my $IN, '< ' . $from_file
or die "Can't open file $from_file : $!\n";
open my $OUT, '> ' . $to_file
or die "Can't create file $to_file : $!\n";
my $line = '';
while (<$IN>) {
chomp; # get rid of the newline
next if $_ eq ''; # skip empty lines
s/\s{2,}/ /g; # replace 2 or more whitespace chars
# with a single space
if ( m{^\d{4}/\d{2}/\d{2} \d\d:\d\d:\d\d} ) {
# if the current line starts with a timestamp ...
# I assume the YYYY/MM/DD HH:MI:SS format
print OUT $line, "\n" if $line;
# print the buffer
$line = $_;
# remember the current line
} else {
$line .= ' ' . $_;
# add the current line to the buffer
}
}
print $OUT $line, "\n" if $line;
# print the last buffer
close $IN;
close $OUT;
}
# now let's process all .log files in the current directory and
# write the results to 'Cleaned' subdirectory
mkdir 'Cleaned', 0777 unless -d 'Cleaned';
opendir my $DIR, '.';
while (defined(my $file = readdir $DIR)) {
next unless $file =~ /\.log$/i;
# skipp all files that do not end with '.log'
next if -d $file; # skip directories
print "$file\n";
CleanupLog $file, 'Cleaned/'.$file;
}
closedir $DIR;
__END__
Of course you'll have to read some introductory docs to be able to
modify this to fit better to your needs, but this should give you a
start.
Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed
to get drunk and croon as much as they like.
-- Terry Pratchett in Sourcery
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]