Robert Hicks am Mittwoch, 11. Januar 2006 17.00:
> "John Doe" <[EMAIL PROTECTED]> wrote in message
> news:[EMAIL PROTECTED]
>
> > Robert Hicks am Dienstag, 10. Januar 2006 18.16:
> > > I have an application log that shows the "time", "id" and "type" for a
>
> user
>
> > > logging in. A short except looks like this:
> > >
> > > 19/12/2005 07:28:37 User (guest) logging in from (LIMS-CIT) - Assigned
> > > Userno (7045)
> > > 19/12/2005 07:32:06 User (guest) logging in from (LIMS-CIT) - Assigned
> > > Userno (1959)
> > > 19/12/2005 07:51:38 User (guest) logging in from (LIMS-CIT) - Assigned
> > > Userno (7601)
> > > 19/12/2005 07:54:10 User (guest) logging off - Userno (7601)
The structure of the logoff line differs from the login line.
> > Are you interested in one specific Userno only, or do you want the login
> > times for all Usernos?
> >
> > What do you mean by "could log in and log out multiple times"? In
> > parallel, or sequential? If parallel: Are different Usernos assigned
> > for the same user logged in multiple times?
>
> I am not really interested in the "user" per se just the "Userno" but that
> can appear several times in the log
> for both logins and logouts.
>
> So I need to first find the login line and Userno and then find the first
> logout line with the Userno and then
> do a time diff.
[...]
> I have only created a regex so far to split the information out and doing
> some counts. Code is below:
>
> use strict;
> use warnings;
> use English;
> use Carp;
>
> my $filename = 'test.log';
> open my $LOG, '<', $filename or croak "Can't open '$filename': $OS_ERROR";
>
> # Test line from logfile
> #$_ = "19/12/2005 08:53:31 ECP3.2.01.1008I : User (guest) logging in from
> (LIMS-CIT) - Assigned Userno (A50C)";
>
> # This parses a login entry
> while (<$LOG>) {
>
> my ( $date, $time, $ecp, $login_message, $login_type, $login_loc,
> $userno,
> $userid )
> = / # regex begins
> ^ # string anchor
> (\d{2}.\d{2}.\d{4}) # $date
> \ # literal space
> (\d+:\d+:\d+) # $time
> \ # literal space
> (ECP\d.\d.\d{2}.\w{5}) # $ecp
> \ # literal space
>
> : # literal :
>
> \ # literal space
> (User\s\([\S.]+\)) # $login_message
> \ # literal space
> (logging\sin) # $login_type
> \ # literal space
> (from\s\([\S.]+\)) # $login_loc
> \ # literal space
> - # literal -
> \ # literal space
> (Assigned\sUserno) # $userno
> \ # literal space
> \( # literal (
> (\w{4}) # $userid
> \) # literal )
> /xms; # regex ends
>
> print join "\n", $date, $time, $ecp, $login_message, $login_type,
> $login_loc, $userno, $userid, "\n";
> last; # I only want one line returned from the log for testing
> }
>
> This prints out:
>
> 19/12/2005
> 07:28:37
> ECP3.2.01.1008I
> User (guest)
> logging in
> from (LIMS-CIT)
> Assigned Userno
> 7045
Ok, one way is to extract the information by regexes (for two different line
structures). Another one I choose below is split. I omit the strings that are
always the same, like "loggin in", and some others for brevity.
It's just a skeleton you could start with:
==== begin script ========
#!/usr/bin/perl
use strict;
use warnings;
sub diff {'exercise for the reader: '.join ', ', @_};
# key: userno
# value arrayref with five entries:
# login date and time, logoff date and time, calculated time diff
#
my %table;
while (<DATA>) {
my @fields=split /\s+/, $_;
my ($date, $time, $inout, $userno)=(@fields[0,1,5], 0);
if ($inout eq 'in') {
($userno)=$fields[11]=~/\((.+)\)/;
if (exists $table{$userno}) { warn "$userno already logged in";}
else { $table{$userno}=[$date, $time]; }
}
else {
($userno)=$fields[8]=~/\((.+)\)/;
unless (exists $table{$userno}) { warn "$userno not logged in";}
else {
my $time_diff=diff(@{$table{$userno}}, $date, $time);
print "$userno: $time_diff\n";
delete $table{$userno};
}
}
}
__DATA__
19/12/2005 07:51:38 User (guest) logging in from (LIMS-CIT) - As User (7601)
19/12/2005 07:52:38 User (guest) logging in from (LIMS-CIT) - As User (7603)
19/12/2005 07:54:10 User (guest) logging off - Userno (7601)
19/12/2005 07:56:38 User (guest) logging in from (LIMS-CIT) - As User (7602)
19/12/2005 07:57:10 User (guest) logging off - Userno (7602)
19/12/2005 07:57:11 User (guest) logging off - Userno (7603)
==== end script ========
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>