Tim Martin wrote:
>
> I have run into a small problem with the script we have been working on for
> log management.
> Problem 1 - The script must be in the same sub directory as all the logs.
What makes you think that it must?
> How can I get the script to run from /var/tmp/gatelog and not in
> var/tmp/gatelog/glogs
Use perl's chdir function to set the current working directory to
whatever you want.
> Problem 2 - The Line of the log dose not have the correct server name in
> column one.
> What I'm I doing wrong.
>
> s00237 2002/12/31 20:47:34 +05 003503E0: STATUS DATA: jobqq= 0 jobqr= 0
> reqdq= 0 gwmethods= 0
> s00237 2002/12/31 21:47:37 +05 003503E0: STATUS DATA: jobqq= 0 jobqr= 0
> reqdq= 0 gwmethods= 0
> 2002/12/31 22:47:45 +05 003503E0: STATUS DATA: jobqq= 0 jobqr= 0 reqdq= 0
> gwmethods= 0
>
> Below is the script we are using.
>
> #!/usr/bin/perl -w
>
> #chdir ("/var/tmp/gatelog/glogs") && die "cannot find directory";
^^
Using && (and) means that you want it to die right after chdir works
correctly. You want to use the logical or so that it dies only if chdir
fails.
chdir '/var/tmp/gatelog' or die "Cannot chdir to '/var/tmp/gatelog' $!";
> my @Gatelogs_list = `ls`;
There is no reason to run an external program to get the list of files
in the current directory.
my @Gatelogs_list = glob '*';
In fact, you can get a list of the files in '/var/tmp/gatelog' without
actually being in that directory.
my @Gatelogs_list = glob '/var/tmp/gatelog/*';
> my $lineprint = '';
> my $lines=`ls | wc -l`;
Since you already have the list of files in @Gatelogs_list you can use
that directly.
my $lines = @Gatelogs_list;
> my $i=0;
> my $line = '';
>
> open (OUT, "> /var/tmp/gatelog/gatelog.txt");
You should _always_ verify that the file was opened.
open OUT, '> /var/tmp/gatelog/gatelog.txt' or die "Cannot open
'/var/tmp/gatelog/gatelog.txt' $!";
> while ($lines >$i){
> open (IN,"$Gatelogs_list[$i]");
The usual way to do this is with a foreach loop:
foreach my $file ( @Gatelogs_list ) {
open IN, $file or die "Cannot open '$file' $!";
> while (<IN>) {
> chomp; # get rid of the newline
> next if $_ eq ''; # skip empty lines
A more robust method is to test for zero or more whitespace characters:
next if /^\s*$/;
> 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
> chomp $Gatelogs_list[$i];
There is no point in chomp()ing the file name here as you wouldn't have
been able to open it if it had an extraneous newline at the end.
> $lineprint = "$Gatelogs_list[$i]" . " " . "$line";
Putting quotes around single scalars is not required, either:
$lineprint = $Gatelogs_list[$i] . ' ' . $line;
Or:
$lineprint = "$Gatelogs_list[$i] $line";
> print OUT $lineprint, "\n" if $line;
> # print the buffer
> $line = $_;
> # remember the current line
> } else {
> $line .= '' . $_;
$line .= $_;
> # add the current line to the buffer
> }
> }
> close IN;
> $i++;
> }
> print OUT $line, "\n" if $line;
> # print the last buffer
> close OUT;
>
> exit 0;
You could simplify it a bit by storing the filenames to read in @ARGV
#!/usr/bin/perl -w
use strict;
open OUT, '> /var/tmp/gatelog/gatelog.txt' or die "Cannot open
'/var/tmp/gatelog/gatelog.txt' $!";
my @ARGV = glob '/var/tmp/gatelog/*';
my $line = '';
while ( <> ) {
chomp; # get rid of the newline
next if /^\s*$/;
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
my $lineprint = "$Gatelogs_list[$i] $line";
print OUT "$lineprint\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 OUT;
exit 0;
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]