my %User_Lst; open ACCESS,"< $FileName" or die "Can't open $FileName for read: $!\n"; while () { /:(..:..:..).*USERID=([a-z0-9].+); .*JSESSIONID=[a-z0-9].*?:(.+)/ and $User_Lst{$2}{$1}{$3}++; } close ACCESS; for my $UserID ( sort keys %User_Lst ) { for my $TStamp ( sort keys %{ $User_Lst{$UserID} } ) { for my $session ( sort keys %{ $User_Lst{$UserID}{$TStamp} } ) { printf "Server Name :%s,\t User Name: %s ,\t Time:%s \n", $session, $UserID, $TStamp; } } }