Andy wrote:
Greets
Hello,
Thanks for your earlier help, but I am still stuck.
I took your advice and I believe I put together the script as you
said.
Except that you apparently haven't yet enabled the warnings and strict
pragmas in your program to help you find your mistakes.
I decided to test with one output file in this case only the failed
log.
I get the creation of the csv but no data .
This is a line from the log I parse
Mon Apr 28 23:55:35 2008 0 X.X.X.X 5 /home3/FTP-protected/IBES/
siteseer/download.tst b _ o r USERNAME ftp 0 * c
#Define LogFiles
my $dateroot = $ARGV[ 0 ]; # Value should be 2-digit month
my $outgoing="outgoing_xferlog.$dateroot.csv"; # This is for all
files sent to users
my $incoming="incoming_xferlog.$dateroot.csv"; #This is log for
uploads
my $loginsinlog="loginsinlog_xferlog.$dateroot.csv"; # This is
wherelog users
my $completedlog="completedlog_xferlog.$dateroot.csv"; # All
Completed Sessions
my $failedlog="failedlog_xferlog.$dateroot.csv"; # This is for
all Failures
my %loginsin;
my %completedlog;
my %failures;
my %incoming;
my %outgoing;
#Time Measured
print "Started Processing Logfiles for $dateroot at " .
(localtimetime) ."\n\n";
'localtimetime' is not a valid Perl function, that should be 'localtime
time' or just 'localtime':
print "Started Processing Logfiles for $dateroot at " . localtime . "\n\n";
If you had enabled the warnings and strict pragmas then perl would have
displayed a message to about that. Please put these two lines at the
top of your program to *help* you find these mistakes:
use warnings;
use strict;
#Open Log File Dir to Read .log file(s)
opendir (DIR, ".") or die "$!";
my @logfiles = grep /xferlog\.$dateroot/, readdir DIR;
close DIR;
#Start Log Processing
foreach my $logfile (@logfiles) {
print "Started Processing: $dateroot at " . (localtime time) ."\n";
open(FH,"./$logfile") or die "$!";
while ( my $line = <FH> ) {
chomp($line);
my @fields = split / /, $line; #This is where we look for the .
extensions
#My Ftp Status Log Values
foreach ($line) { #You mentioned why use this here? Is there a
better way?
foreach loops over a list of items but you only have one scalar in that
list. foreach then aliases $_ to each item in that list in turn but you
never use $_ inside the loop. Therefore the foreach loop is superfluous
and should be removed.
print "HELLO";
my $TIME = [3];
That should be:
my $TIME = fields[3];
my $YEAR = $fields[4];
my $IP = $fields[6];
my $SIZE = $fields[7]; #filesize
my $FILE = $fields[8]; #filename and path
my $DIRECTION = $fields[11]; #Outgoing, Incoming
my $USERNAME = $fields[13];
my $STATUS= $fields[17]; #c = completed
i=incomplete
( my $MASKFILE = $FILE ) =~ tr/0-9/#/;
#Failures This is where we check for
failures
if ($STATUS eq "i" ){$failures {$USERNAME} = $TIME.",".$YEAR.",".
$FILE.",".$IP;}
#completed sessions Last Login
if ($STATUS eq "c" ){$completedlog {$USERNAME} = $TIME.",".
$YEAR.",".
$IP;}
#Completed incoming
if ($DIRECTION eq "i" and $STATUS eq "c" ){$incoming {$USERNAME} =
$TIME.",".$YEAR.",".$FILE.",".$SIZE.",".$IP;}
#Outgoing this is where we log all
outgoing xfers
if ($DIRECTION eq "o" and $STATUS eq "c" ){$outgoing {$USERNAME} =
$TIME.",".$YEAR.",".$FILE.",".$SIZE.",".$IP;}
}
}
close(FH);
}
open(OUTPUT, '>', $failedlog) or die("Could not open log file.");
foreach $key ( sort keys %failures ) {"$key,$failures{$key}\n";}
You have a string in void context inside the loop. If you had enabled
the warnings and strict pragmas then perl would have displayed a message
to that effect. Please put these two lines at the top of your program
to *help* you find these mistakes:
use warnings;
use strict;
close(OUTPUT);
John
--
Perl isn't a toolbox, but a small machine shop where you
can special-order certain sorts of tools at low cost and
in short order. -- Larry Wall
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/