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:
- Eu tenho que "seguir" o arquivo de registro duas vezes para que o script funcione e ...
- ... 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