Thread Hash automatisch aus Daten erstellen (3 answers)
Opened by Nico at 2015-11-10 08:54

Gast Nico
 2015-11-10 12:47
#182848 #182848
hier ist meine Lösung um eine differenz zwischen der letzten ein und auslogg zeit zu bilden (pro IP)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /usr/bin/perl
#use strict;
use warnings;

use Time::Local;

my $infile =  "D:\\Privat\\PERL Projekt\\access.log.proxy";
my $outfile = "D:\\Privat\\PERL Projekt\\auswertung.csv";
my ($ip,$date,$time);
my ($d, $mon, $yy, $h, $min, $sek) = 0;
my $sektime = 0;
my ($gestern, $daten);
my %dl;
#print ("Bitte Datum von Gestern eingeben");
#print ("Beispiel: 02/Nov/2015\n");
#chomp ($gestern=<STDIN>);
$gestern = "02/Nov/2015";

open (READLOG, "<$infile") or die ("Datei $infile nicht gefunden.\n\n");
open (WRITE, ">$outfile") or die ("Datei $outfile konnte nicht erstellt werden.\n\n");

while (<READLOG>){
   if ($_=~m/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}[^\[\]]+\[\d{2}\/[a-zA-z]{3}\/\d{4}:\d{2}:\d{2}:\d{2}\s[\+|\-]\d{4}\]/)
   {
      ($ip,$date,$time) = m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^\[\]]+\[(\d{2}\/[a-zA-z]{3}\/\d{4})\:(\d{2}:\d{2}:\d{2})\s[\+|\-]\d{4}\]/;
      
      if ($date eq $gestern) {
         ($d, $mon, $yy) = split( "/", $date );
         ($h, $min, $sek) = split( ":", $time );
         $sektime = timelocal ($sek,$min,$h,$d,$mon,$yy);                
          push (@{$dl{$ip}}, $sektime);                               #hier mach ich ein dreidimensionales Hash, die Zeitstempel werden der reihe
                                                                       nach pro Ip in ein Array geschrieben
         }
   }
}

                              
my $i = 0;                                                          
foreach $daten (sort keys %dl){
      $i = ${$dl{$daten}}[-1] - ${$dl{$daten}}[0];                      # hier rechne ich den letzten wert des arrays - den 1. wert
      $sek      = $i%60;
      $min      = (($i-$sek)/60)%60;
      $h        = ($i-$sek-($min*60))/3600;
      print WRITE ("$daten;$h:$min:$sek\n");
}

close (WRITE);
close(READLOG);


ein kleines Problem habe ich noch. Wenn in einem Array nur 1 Wert steht, wie kann ich die betreffenden IPs auslassen?
Last edited: 2015-11-10 13:01:40 +0100 (CET)

View full thread Hash automatisch aus Daten erstellen