2017-03-20 2 views
0

Ich habe viele Daten in einer Datei wie wie untenExtrahieren von Feldern aus einer Datei in Shell

alert tcp any any -> any any (msg: "test1"; sid:16521; rev:1;created_at 2010_07_30, updated_at 2016_07_01;) 
alert tcp any any -> any any (msg: "test2"; nocase; sid :23476;distance:0; rev:1;created_at 2010_10_30, updated_at 2013_07_11;) 
alert tcp any any -> any any (msg: "test3"; sid:236487; file_data; content:"clsid"; nocase; distance:0; created_at 2008_08_03, updated_at 2016_05_01; 

Ich möchte sid, msg, created_at und updated_at aus der Datei & Ausgabe sollte extrahieren sieht aus wie

test1 | 16521 | 2010_07_30 | 2016_07_01 
test2 | 23476 | 2010_10_30 | 2013_07_11 
test3 | 236487| 2008_08_03 | 2016_05_01 

und das Skript, die ich verwendet, ist

cat $file | grep -v "^#" | grep "^alert" | sed 's/\"//g' | awk -F ';' ' 
{ 
     for(i=1;i<=NF;i++) 
    { 
      if (match($i,"sid:")>0) 
     { 
      split($i, array1, ":") 
      Rule_sid=array1[2] 
        } 
      if(match($i,"msg:")>0) 
        { 
         split($i, array, "(") 
      split(array[2], array2, ":") 
         message=array2[2] 
        } 
      if(match($i,/metadata:/)>0) 
     { 
      split($i, array3,/created_at/) 
      create_date=array3[2] 
     } 
      if(match($i,/metadata:/)>0) 
        { 
         split($i, array4, ", updated_at ") 
      update_date=array4[2] 
        } 


      } 
      print Rule_sid "|" message "|" create_date "|" update_date 
    }' >> Rule_Files/$file 
+0

So versehen Sie Code, den Sie versucht. Was ist schief gelaufen? Was ist unterschiedlich zwischen was es ausgegeben und was du wolltest? –

+0

Ich kann created_at & updated_at nicht wie oben korrekt entpacken – mahi

+0

Entschuldigung, ich habe alle erforderlichen Änderungen vorgenommen – mahi

Antwort

0

Für den Anfang können Sie extrahieren die Felder mit einem regex sed:

sed '/^alert/s/^.*msg[: ]*"\([^"]*\)".*sid[: ]*\([0-9][0-9]*\);.*created_at *\([^,]*\),.*updated_at *\([0-9_][0-9_]*\).*$/\1|\2|\3|\4/' $file 

die Sie die Ausgabe wie folgt gibt:

test1|16521|2010_07_30|2016_07_01 
test2|23476|2010_10_30|2013_07_11 
test3|236487|2008_08_03|2016_05_01 

Jetzt wollen Sie, dass schön in Spalten aufgereiht, werden Sie es zu etwas füttern müssen andere, vielleicht awk:

sed '/^alert/s/^.*msg[: ]*"\([^"]*\)".*sid[: ]*\([0-9][0-9]*\);.*created_at *\([^,]*\),.*updated_at *\([0-9_][0-9_]*\).*$/\1|\2|\3|\4/' $file | 
awk -F\| 'BEGIN { OFS="| " } {$2=sprintf("%6d",$2)}1' 

Was Sie ergibt dies:

test1| 16521| 2010_07_30| 2016_07_01 
test2| 23476| 2010_10_30| 2013_07_11 
test3| 236487| 2008_08_03| 2016_05_01 

Wenn Sie mit beliebig breiten Spaltenwerten arbeiten müssen und dennoch die vertikale Ausrichtung benötigen, müssen Sie etwas schreiben, das zuerst alle Zeilen verarbeitet, um den breitesten Wert zu finden, bevor Sie etwas ausdrucken. Das ist eine Übung, die ich dem Leser überlasse.

0

Mit awk

Ändern -v OFS=" | " und -v extract="msg,sid,created_at,updated_at" wie pro Ihr Interesse, OFS Ausgabefeld Separator ist und variable extract hält Liste der Felder (durch Komma getrennt), die analysiert werden müssen, wenn alle Felder wird es nicht gefunden geben Null

Programm nimmt an Feldwert existiert neben aktuellen Feld Spiel, sid suppose Feld gefunden, wenn j=4, dessen Wert bei j+1 existiert, die bei j=5 ist.

Eingang

$ cat file 
alert tcp any any -> any any (msg: "test1"; sid:16521; rev:1;created_at 2010_07_30, updated_at 2016_07_01;) 
alert tcp any any -> any any (msg: "test2"; nocase; sid :23476;distance:0; rev:1;created_at 2010_10_30, updated_at 2013_07_11;) 
alert tcp any any -> any any (msg: "test3"; sid:236487; file_data; content:"clsid"; nocase; distance:0; created_at 2008_08_03, updated_at 2016_05_01;) 

Ausgabe

$ awk -v OFS=" | " -v extract="msg,sid,created_at,updated_at" ' 
BEGIN{ 
    split(extract,Fields,/,/) 
} 
{ 
    gsub(/[:";,()]/," "); 
    s=""; 
    for(i=1; i in Fields; i++) 
    { 
     f = 1 
     for(j=1; j<=NF; j++) 
     { 
      if($j==Fields[i]) 
      { 
       f = 0 
       s = (s ? s OFS :"") $(j+1) 
       break 
      } 
     } 
     if(f){ 
      s = (s ? s OFS:"") "Null" 
     }  
    } 
     print s 
}' file 

test1 | 16521 | 2010_07_30 | 2016_07_01 
test2 | 23476 | 2010_10_30 | 2013_07_11 
test3 | 236487 | 2008_08_03 | 2016_05_01 
Verwandte Themen