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"'