2016-08-01 20 views
0

Wie extrahiere ich den Zeitteil nur aus einer Zeichenfolge wie dieser.Protokollzeit aus Protokolldatei extrahieren

[20/06/2016 15:55:42.079] <Messenger> Echo test request 

Ich will nur diesen Teil bekommen 15: 55: 42,079 aus dem Protokoll.

+0

auch wenn Fragen veröffentlichen, beachten Sie bitte, dass Sie Wir müssen uns die Mühe - in Form von Code - zeigen, um das zu lösen. –

Antwort

1

Der einfachste Weg ist mit Parametern Expansion und Teilzeichenfolge Entfernung, zB:

var="[20/06/2016 15:55:42.079] Echo test request" 
tm=${var%]*}  ## remove all from right including ']' 
tm=${tm#* }  ## remove all from left including ' ' 
echo "time $tm" ## your time is now in $tm 

über den Betrieb ${var%]*} nutzt den % Operator, der aus den Werken von rechts nach links alles entfernt '*', bis dem ] ist erreicht. Jetzt auf den Rest der Zeichenfolge [20/06/2016 15:55:42.079 ein dieser Punkt, benötigen Sie einfach den Operator #, die von links nach rechts von Anfang an entfernt. Hier entfernen wir '*' (alles) einschließlich der ' ' nur 15:55:42.079 in der Variablen tm verlassen.

Lassen Sie mich wissen, wenn Sie Fragen haben.

3

Sie können dies versuchen:

awk -F']| ' '{print $2}' <<< "STRING" 

Test:

$ awk -F']| ' '{print $2}' <<< "[20/06/2016 15:55:42.079] Echo test request" 
15:55:42.079 
+1

Das ist ein besserer Ansatz als meiner :) ++ – sjsam

2

sed Auch das ist dein Freund:

$ sed -E 's/^[^[:blank:]]*[[:blank:]]([^]]*)\].*$/\1/' 38693974 
15:45:42.079 
15:55:12.079 
15:55:42.079 
15:56:42.079 
+2

Danke Es funktioniert ... awk ist handlich – simbabarry

+1

Warum nicht nur sub und drucken $ 2? – 123

+0

@ 123: Ich habe den awk-Teil gelöscht, weil die andere Antwort das Problem besser anspricht. Und ja ! Du hast recht "sub und print $ 2" wäre mit meinem gelöschten Ansatz besser gewesen. ;) – sjsam