Diferença de tempo de computação a partir de entradas do arquivo de log

0

Eu tenho dois campos no tempo de envio de logs e o tempo de recebimento mencionado em milissegundos, eu tenho que encontrar a diferença entre esses dois campos, se ele for maior que 2 segundos, imprima esses logs usando o shell script ou comandos do Linux.

2017-01-27 object1(sendtime-1486743904359 ,recdtime-  1486743904500)
2017-01-27 object2(sendtime-1486743904800 ,recdtime-  1486743908000)

meus arquivos de log também contêm outras linhas, que eu preciso filtrar com base na condição de tempo de envio / recebimento acima e somente logs que contenham a palavra-chave "sendobject". Outros como pedido enviado, pedido recebido deve ser ignorado

Detalhes do log -

2017-01-27 [Info]Delta Cache sendobject (empId-emp1, joindate-456,dealdate-123,sendtime-1527348020000 ,recdtime-1527348028000, salary-1k,amtpaid-EUR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp2, joindate-456,dealdate-123,sendtime-1527348073000 ,recdtime-1527348074000, salary-1k,amtpaid-AUD)
2017-01-27 [Info]Requestsent| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp3, joindate-456,dealdate-123,sendtime-1527349111000 ,recdtime-1527349112000, salary-1k,amtpaid-GBP)
2017-01-27 [Info]Delta Cache sendobject (empId-emp4, joindate-456,dealdate-123,sendtime-1527349370000 ,recdtime-1527349375000, salary-1k,amtpaid-CAD)
2017-01-27 [Info]Requestrecicved| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]Delta Cache sendobject (empId-emp6, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
2017-01-27 [Info]DBupdated| (empId-emp1, joindate-456,dealdate-123,sendtime-1527352812000 ,recdtime-1527352820000, salary-1k,amtpaid-INR)
    
por Unix1 17.05.2018 / 08:23

2 respostas

2

Com awk você pode fazer como:

awk -F"[- ,)]" '$(NF-1)-$5 >2000' infile
2017-01-27 object2(sendtime-1486743904800 ,recdtime-  1486743908000)

Aqui definimos conjuntos de hífen, espaço, vírgula e parênteses de fechamento como separadores de campos.

para responder à pergunta revisada, tente:

awk -F"[- ,]" '/sendobject/ && $18-$15 >2000' infile
    
por 17.05.2018 / 09:03
1

Uma variante na resposta @ αғsнιη :

awk -F'(sen|rec)dtime-' 'NF==3 && $3 - $2 > 2000'

Ou, se os registros contiverem todos os tipos de linhas ao lado desses, você poderá ser ainda mais restritivo ao corresponder a entrada com perl :

perl -ne 'print if m{
    ^\d{4}-\d\d-\d\d\s+
    object\d+\(
       sendtime-(\d+)\s*,
       recdtime-\s*(\d+)
    \)$}x && $2 - $1 > 2000'
    
por 17.05.2018 / 13:08