Redirecionando a saída do GREP para diferentes arquivos de texto, dependendo do conteúdo da captura

1

Eu tenho um arquivo de log com dois eventos distintos (entre outros) que eu preciso capturar.

Cada evento gera uma linha separada e dedicada no arquivo de log com este formato:

timestamp - PID - processo - tipo de evento - detalhes do evento

Eu não me importo muito com nada, mas a coluna detalhes do evento do arquivo, e os dados que espero receber lá, são assim:

Exemplo 1: { "values":{ "SPEED":"7.0" } }

Exemplo 2: { "values":{ "CADENCE":"41" } }

Eu tenho tentado escrever um script de shell que só lia a última linha do arquivo de log toda vez, e dependendo do conteúdo dos detalhes do evento coluna, redirecione os dados SPEED ou CADENCE resultantes para um arquivo de texto específico (quando digo dados SPEED / CADENCE resultantes, quero dizer o "número inteiro" depois da expressão SPEED ":" por exemplo).

Até agora consegui redirecionar os resultados para dois arquivos diferentes, mas:

  1. Eu tenho que "seguir" o arquivo de registro duas vezes para que o script funcione e ...
  2. ... como resultado disso, tenho a sensação de que o segundo arquivo não está sendo atualizado na mesma taxa que o primeiro ... como se, por algum motivo, eu estivesse perdendo alguns dos > CADENCE eventos devido à ordem em que o script foi escrito.

Eu tentei usar a função sleep e também tentei "seguir" mais de uma linha de cada vez para tentar atenuar a falta de atualização CADENCE sem sorte . Eu continuo perdendo os eventos CADENCE de tempos em tempos.

Uma observação sobre o comportamento do arquivo de log: Observando o log, há três eventos que aparecem na maioria das vezes e sempre são registrados na mesma ordem de aparência (CADENCE, SPEED e OTHER ) e, de tempos em tempos, há um 4º evento. Eu só queria esclarecer que os eventos CADENCE ausentes não têm nada a ver com a aparição do evento "4rd".

Esta é uma versão resumida do script que estou executando atualmente:

#!/bin/bash
while :
do
   tail -1 logfile.txt | grep -oP '(?<=SPEED":")[0-9]+' > spd.txt
   tail -1 logfile.txt | grep -oP '(?<=CADENCE":")[0-9]+' > cad.txt
done

======= UPDATE: =======

Esta é a linha de log completa e a saída esperada:

Exemplo da linha 1:

Entrada (de logfile.txt):

03-16 21: 05: 28.641 2797-2842 / process: Serviço D / WEBSOCKET: recebimento: {"values": {"Speed MPH": "3.1", "Velocidade KPH": "4.9", "Milhas ":" 0,551 "," Quilómetros ":" 0,886 "}}

Saída (enviada para spd.txt):

4.9

Exemplo da linha 2:

Entrada (de logfile.txt):

03-16 21: 05: 29.309 2797-2842 / process: Serviço D / WEBSOCKET: recebimento: {"values": {"RPM": "27"}}

Output: (enviado para o arquivo cad.txt):

27

    
por danbee 30.03.2017 / 00:49

2 respostas

0

Entendi Kamaraj, obrigado pela ajuda! foi fundamental encontrar a resposta certa:

Este é o script que funcionou para mim:

tail-1 logfile.txt | awk -F "\": \ "" '{para (c = 1; c < = NF; c ++) {if ($ c ~ / Speed KPH /) {print $ (c + 1) +0 > "spd.txt"} {if ($ c ~ / RPM /) {print $ (c + 1) +0 > "cad.txt"}}}} '

Teve que voltar para tail -1 porque tail -f foi afetado pelo buffering e seria também deixa um rastro no arquivo txt com todos os valores capturados. Eu estava esperando apenas uma única linha com o resultado mais atual nos arquivos de texto de saída.

Obrigado e cumprimentos!

    
por 02.04.2017 / 19:01
0

Não há necessidade de loop while aqui ...

tail -f logfile.txt | awk '/SPEED/{print >"spd.txt"}/CADENCE/{print >"cad.txt"}'
    
por 30.03.2017 / 02:02