swonson Geschrieben 16. März 2011 Teilen Geschrieben 16. März 2011 Hallo Leute, ich suche seit heute Früh Google wund und finde nichts. Ich bin gerade dabei ein Shell Script zu schreiben, welches folgende Zeile zerlegen soll. 2010-03-14 21:13:54 [iNFO] swonson [/xx.xx.xxx.xxx.:xxxx] logged in with entity id 34 Das Problem, welches ich habe ist, dass der Name "swonson" auch ein anderer sein kann, also auch kürzer oder länger. Gleiches gilt für die Ip die in [] seht. Den Timestamp vorne bekomme ich bereits weg, da die Zeichenlänge ja immer die gleiche ist. Bisher habe ich nur folgendes: DATEI=Server_02/server.log for var in $DATEI do egrep "logged in" $var egrep "logged in" $var | cut -c 1-19 egrep "logged in" $var | cut -c 20-27 done Ziel des Ganzen ist es den Timestamp, den Nick und das "logged in" oder "disconnect" in ein array zu packen. Mit dem oben genannten Script bekomme ich diese Ausgaben: 2011-03-16 12:11:52 [iNFO] Was auch okay ist. Ich komme aber leider nicht weiter. Mein Idee war es den Nick auszulesen in dem ich sage nimm alles zwichen ] und [ und geb es mir. Ich finde nur nicht heraus wie das geht. Ich hoffe ihr könnt mir helfen. Gruß der Swonson Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schepp Geschrieben 16. März 2011 Teilen Geschrieben 16. März 2011 guck dir mal die Option -d von cut an. Den Namen bekommst du in deinem Fall z.B. über cut -d "]" -f2 | cut -d "[" -f1 Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
swonson Geschrieben 16. März 2011 Autor Teilen Geschrieben 16. März 2011 cut -d "]" -f2 | cut -d "[" -f1 Cool vielen dank. Ich wusste nicht das ich cut zweimal hintereinander setzen kann super vielen dank! Gruß der swonson Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
swonson Geschrieben 16. März 2011 Autor Teilen Geschrieben 16. März 2011 (bearbeitet) Ich musste nun feststellen, dass mein Anfang relativ schlecht war. um meine egrep-Ausgabe nun in ein Array zu packen habe ich folgendes getan: arr1[$i]=`egrep "logged in" $var | cut -c 1-19` Klappt auch super. Leider musste ich jetzt feststellen, das egrep alle Ergebnisse, sprich alle Zeilen in ein Array-Feld packt, da er nicht Zeile für Zeile checkt sonder den ganzen Text und alles aufeinmal ausgibt. Gibt es da für eine gescheite lösung? So sieht die Ausgabe meines Arr-Feldes aus: 2011-03-14 17:01:15 2011-03-14 17:03:41 2011-03-14 17:25:46 2011-03-14 17:26:42 2011-03-14 17:27:33 2011-03-14 17:27:53 2011-03-14 17:31:55 2011-03-14 17:40:42 2011-03-14 17:47:28 2011-03-14 19:40:09 2011-03-14 20:01:10 2011-03-14 20:13:50 2011-03-14 20:39:37 2011-03-14 20:45:00 2011-03-14 20:50:40 2011-03-14 20:56:59 2011-03-14 20:58:15 2011-03-14 20:59:49 2011-03-14 21:11:07 2011-03-14 21:13:06 2011-03-14 21:13:48 2011-03-14 21:14:14 2011-03-14 21:16:53 2011-03-14 21:18:58 2011-03-14 21:28:15 2011-03-14 21:28:48 2011-03-14 21:41:47 2011-03-14 21:45:50 2011-03-14 21:49:17 2011-03-14 22:17:30 2011-03-14 22:20:21 2011-03-14 22:24:03 2011-03-14 22:43:17 2011-03-14 22:46:25 2011-03-16 12:11:52 Ich hätte es aber gerne so: arr[1]: 2011-03-14 22:24:03 arr[2]: 2011-03-14 22:43:17 ect... Hat jemand einen Anfang für mich? EDIT: oder liegt es an der schleife? for var in $DATEI do arr1[$i]=`egrep "logged in" $var | cut -c 1-19` arr2[$y]=`egrep "logged in" $var | cut -d "]" -f2 | cut -d "[" -f1` i++ y++ done Bearbeitet 16. März 2011 von swonson Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schepp Geschrieben 17. März 2011 Teilen Geschrieben 17. März 2011 Es liegt an der For-Schleife. Die ist nämlich ziemlich Grütze zum Scripten Dein i++ und y++ wird nur 1 mal am Ende ausgeführt (übrigens kannst du dir das $y sparen, ist ja eh immer der selbe Wert wie $i. Was du machen könntest: grep erstmal das log nach "logged in" und schreib das ganze in eine temp-Datei. Zähl die Anzahl der Zeilen in der temp-Datei und schreib sie in eine Variable. Schreib eine While-Schleife, die mit sed -n die Temp-Datei Zeile für Zeile augibt, damit du sie zurechtschneiden und in dein Array schreiben kannst. so z.B. ZEILEN=$(wc -l $TEMP | cut -d " " -f6) i=1 while [ $i -le $ZEILEN ] do array1[$i]=$(sed -n $i"p" $TEMP | cut -c 1-19) i++ done Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.