Comando Linux para cortar um arquivo de log

Comando Linux para cortar um arquivo de log

Eu tenho um arquivo de log chamado version.txt e preciso filtrar todas as palavras com palavras-chave (time=e a saída deve ser semelhante (time=451)a etc.

Abaixo estão os exemplos de entradas do arquivo de log. Destaquei as entradas que desejo listar. Se eu cortar ou aparar, ele imprimirá a linha inteira em vez de word (time=.

Por favor, sugira um comando para listar palavras desde (time=a inclusão do número até o fechamento ).

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)

A saída deste exemplo de entrada deve ser semelhante a

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

Responder1

A questão não está totalmente clara.

O comando

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

com o exemplo de entrada da pergunta é impresso

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

Edite para cobrir requisitos adicionais de um comentário:

Adicionar o campo de data e hora desde o início das linhas à saída requer um comando diferente.

Se todas as linhas da entrada contiverem (time=...)e começarem com campos de data e hora separados por caracteres de espaço simples, você poderá usar

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

Isso imprime

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

Se houver outras linhas não correspondentes, você pode combinar isso com o mesmo greppadrão acima, mas omitir -o.

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

Observe que o padrão de pesquisa no meu sedcomando não é muito rígido.

A parte [-0-9]* [:0-9]*corresponde a qualquer número de dígitos e travessões em qualquer combinação (a data) seguida por um único espaço, qualquer número de dígitos e dois pontos (a hora) seguido novamente por um único espaço. O padrão é ancorado no início da linha pelo ^.

Portanto, também corresponderia a campos de data e hora incorretos, como ---123--456- 9876:54321ou até mesmo dois espaços no início da linha.

informação relacionada