Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Mit einem Shell Script ein String zerlegen

Empfohlene Antworten

Veröffentlicht

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

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

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 von swonson

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.