swonson Geschrieben 16. März 2011 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
schepp Geschrieben 16. März 2011 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ß
swonson Geschrieben 16. März 2011 Autor 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
swonson Geschrieben 16. März 2011 Autor 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
schepp Geschrieben 17. März 2011 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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden