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 grep
Muster 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 sed
Befehl 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:54321
oder sogar zwei Leerzeichen am Zeilenanfang übereinstimmen.