Veröffentlicht 16. März 201114 j 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
16. März 201114 j 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ß
16. März 201114 j 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
16. März 201114 j 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 201114 j von swonson
17. März 201114 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.