2016-04-17 10 views
-1

Ich habe den folgenden Eintrag in meiner Protokolldatei.Getrennte Zeichenkettenvariable der Protokolleingabe- und -ausgabeteile in Textdatei (PERL)

[2016-04-17 10:12:27:682011 GMT] tcp 115.239.248.245:1751 -> 192.168.0.17:8080 52976f9f34d5c286ecf70cac6fba4506 04159c6111bca4f83d7d606a617acc5d6a58328d3a631adf3795f66a5d6265f4d1ec99977a5ae8cb2f3133c9503e5086a5f2ac92be196bb0c9a9f653f9669495 (312 bytes) 

Ich möchte ein Skript schreiben, um diese eine Zeile Zeichenfolge in Stücke aufzuteilen, um einige dieser Stücke in einer CSV-Datei für maschinelles Lernen zu schreiben. Bis jetzt habe ich dieses Skript, um ein bestimmtes Muster zu finden und, wenn gefunden, schreiben, was es gegeben wurde, zu finden, hardcoded Suche. Das ist nicht was ich will. Das ist das Skript, das ich gerade habe.

#!/usr/bin/perl -w 

$path1 = "/home/tsec/testwatch/attackerresult.log"; 
$attacker = ">>/home/tsec/testwatch/attacker.csv"; 
#$path2 = 
#$path3 = 
#$path4 = 

#function definition #Pattern for attackerlog only 
sub extractor(){ 
open(LOG, $path1) or die "Cant't open '$path1': $!"; 
open(FILE, $attacker) or die "Can't open '$attacker': $!"; 

$target = "tcp"; 

while(<LOG>){ 

     if(/$target/){ 
     print FILE $target . "\n"; 

     } 
} 
} 
close(LOG); 
close(FILE); 

Ich möchte die Ausgabe in der CSV-Datei, so etwas sein:

ich die csv tun Titel manuell

(Titel) Protokoll, Quell-IP-Adresse, Source Port, Dateigröße kann

(String Ergebnis aus script) tcp, 127.0.0.1, 8080, 312

Das obige ist nur ein Beispiel.

Irgendeine Idee?

+0

Die erforderliche Ausgabe erscheint mit dem Eingang in keinem Zusammenhang zu sein, die Ihnen zeigen – Borodin

+2

[at PerlMonks x-posted] (http://perlmonks.org/?node_id=1160718) – stevieb

Antwort

0

Wenn alle Zeilen immer die gleiche Anzahl von Feldern haben, funktioniert dies.

use warnings; 
use strict; 

open my $wfh, '>', 'out.csv' or die $!; 

my $cols = "Protocol, Source IP Address, Source Port, File Size\n"; 
print $wfh $cols; 

while (<DATA>){ 
    if (/ 
      (?:.*?\s){3} # get rid of the time 
      (.*?)   # capture the proto ($1) 
      \s+   # skip the next whitespace  
      (.*?):(\d+) # separate IP and port, capture both ($2, $3) 
      .*?\(  # skip everything until an opening parens 
      (\d+)   # capture bytes ($4) 
     /x 
     ){ 
     print $wfh "$1, $2, $3, $4\n"; 
    } 
} 


__DATA__ 
2016-04-17 10:12:27:682011 GMT tcp 115.239.248.245:1751 -> 192.168.0.17:8080 52976f9f34d5c286ecf70cac6fba4506 04159c6111bca4f83d7d606a617acc5d6a58328d3a631adf3795f66a5d6265f4d1ec99977a5ae8cb2f3133c9503e5086a5f2ac92be196bb0c9a9f653f9669495 (312 bytes) 

Ausgabedatei:

Protocol, Source IP Address, Source Port, File Size 
tcp, 115.239.248.245, 1751, 312