monitore syslog e imprima a linha sem 'padrão'

2

Gostaria de monitorar meu /var/log/syslog continuamente. No entanto, durante o monitoramento, gostaria de evitar certos padrões durante o monitoramento. Estou interessado apenas nas últimas 15 linhas (por exemplo).

Para o monitoramento usual eu uso o comando:

watch -n 1 tail -n 15 /var/log/syslog

Considerando que o que eu realmente gostaria de ter é algo como:

watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2'

Sendo mais específico com minha exigência:

Eu gostaria de monitorar continuamente as entradas no syslog , evitando certos padrões. A tela deve ser atualizada a cada período fixo (digamos 1s ou 2s).

A seguir, mais tentativas (com falha):

watch cat /var/log/syslog | grep -v -E 'pattern1|pattern2'

Tentativa (parcialmente) bem-sucedida:

while true;
do 
  clear;
  cat /var/log/syslog | grep -v -E 'pattern1|pattern2' | tail -15;
  sleep 1;
  echo '\"CTRL-C\" to close';
done

No entanto, a suavidade de watch é perdida aqui.

Resumo

Portanto, a questão é se existe alguma maneira de combinar watch , tail e grep ?

Estou usando bash 4.4.7 em 17.04.

    
por Mike V.D.C. 27.06.2017 / 16:16

1 resposta

0

O problema com o watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2' , eu acho , é que ele executa tail -n 15 /var/log/syslog dentro de watch e, em seguida, canaliza o resultado para grep . Isso quase certamente faz com que a saída intermediária seja armazenada em buffer de tal forma que você não veja o que você espera (pelo menos, não quando você espera).

Provavelmente, existe uma maneira de obter o que você deseja com o uso inteligente da opção stdbuf e / ou --line-buffered grep, mas uma maneira mais simples é executar todo o pipeline em watch :

watch -n 1 'tail -n 15 /var/log/syslog | grep -v -E "pattern1|pattern2"'
    
por steeldriver 28.06.2017 / 16:12