Linux-Befehl zum Kürzen einer Protokolldatei

Linux-Befehl zum Kürzen einer Protokolldatei

Ich habe eine Protokolldatei mit dem Namen „version.txt“ und muss alle Wörter mit dem Schlüsselwort herausfiltern. (time=Die Ausgabe sollte (time=451)ungefähr so ​​aussehen:

Unten sind die Beispieleinträge aus der Protokolldatei. Ich habe die Einträge markiert, die ich auflisten möchte. Wenn ich ausschneide oder trimme, wird die gesamte Zeile statt des Wortes gedruckt (time=.

(time=Bitte schlagen Sie einen Befehl vor, um Wörter von der Nummer bis zum Schluss aufzulisten ).

2020-03-10 06:48:20 [http-nio-7001-exec-7] INFO  [5e6770737be8a35b5fef38f7be2a2635] [5fef38f7be2a2635] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - DeliveryMethod(sosItmNbr=null, fullMtdTyp=3, fullMtdMsg=Delivery, fullCarrier=null, fullCarrierSvc=null, fullTransitMode=null, fullLctNbr=0, restMsg=null, isAvlSts=false, reqStates=[], onhandQty=0, totalQty=0, itmLdTmAvlQty=0, itmLdTm=null, itmConsolidationDate=null, itmLdTmDays=null, itmLdTmDaysLow=null, fullPath=null)])]) (time=451) 
2020-03-10 06:48:20 [http-nio-7001-exec-28] INFO  [5e677073e64bd99b5997b5bd20c3c4e0] [5997b5bd20c3c4e0] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - Finished availability process; Response: IAResponse(locationItemData=[ResponseItem(lctNbr=6877, itemNbr=10000070, modID=1500040, omniID=null, vbuNbr=14692, itmTypCode=3, reqQty=17, itemAvailList=[DeliveryMethod(sosItmNbr=null, fullMtdTyp=1, fullMtdMsg=Parcel, fullCarrier=null, fullCarrierSvc=null, fullTransitMode=null, fullLctNbr=0, restMsg=null, isAvlSts=false, reqStates=[], onhandQty=0, totalQty=0, itmLdTmAvlQty=0, itmLdTm=null, itmConsolidationDate=null,(time=455)
2020-03-10 06:48:20 [http-nio-7001-exec-46] INFO  [5e6770731c4e323f4cb875712bb0d8ee] [4cb875712bb0d8ee] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - Finised (time=492)

Die Ausgabe dieser Beispieleingabe sollte wie folgt aussehen:

(time=451)
(time=455)
(time=492)

Antwort1

Die Frage ist nicht ganz klar.

Der Befehl

grep -o '(time=[[:digit:]]*)' inputfile

mit den Beispieleingaben aus den Fragedrucken

(time=451)
(time=455)
(time=492)

Bearbeiten, um zusätzliche Anforderungen aus einem Kommentar abzudecken:

Das Hinzufügen des Datums- und Uhrzeitfelds vom Anfang der Zeilen zur Ausgabe erfordert einen anderen Befehl.

Wenn alle Zeilen der Eingabe (time=...)Datums- und Zeitfelder enthalten und mit diesen beginnen, die durch einzelne Leerzeichen getrennt sind, können Sie

sed 's/^\([-0-9]* [:0-9]* \).*\((time=[[:digit:]]*)\).*/\1\2/' inputfile

Dieser Druck

2020-03-10 06:48:20 (time=451)
2020-03-10 06:48:20 (time=455)
2020-03-10 06:48:20 (time=492)

Wenn es andere nicht übereinstimmende Zeilen gibt, können Sie dies mit dem gleichen grepMuster wie oben kombinieren, aber weglassen -o.

grep '(time=[[:digit:]]*)' inputfile | sed 's/^\([-0-9]* [:0-9]* \).*\((time=[[:digit:]]*)\).*/\1\2/'

Beachten Sie, dass das Suchmuster in meinem sedBefehl nicht sehr streng ist.

Der Teil [-0-9]* [:0-9]*entspricht einer beliebigen Anzahl von Ziffern und Bindestrichen in beliebiger Kombination (das Datum), gefolgt von einem einzelnen Leerzeichen, einer beliebigen Anzahl von Ziffern und Doppelpunkten (die Uhrzeit), gefolgt wiederum von einem einzelnen Leerzeichen. Das Muster wird durch das vorangehende am Zeilenanfang verankert ^.

Daher würden auch falsche Datums- und Zeitfelder ---123--456- 9876:54321oder sogar zwei Leerzeichen am Zeilenanfang übereinstimmen.

verwandte Informationen