Eu acho que seu problema está relacionado ao buffer de tail -f :
~$ tail auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
FOUND
FOUND
Funciona com tail , mas falha com tail -f :
~$ tail -f auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
^C
Uma solução alternativa que você pode usar é usar um loop while para ler cada linha de tail -f :
~$ tail -f auth.log | while read line
> do
> echo $line | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND")} }'
> done
FOUND
FOUND
-
Pesquisando man awk para buffer , encontrei a opção -W (mas esta é uma versão mawk …):
-W interactivesets unbuffered writes to stdout and line buffered reads from stdin. Records from stdin are lines regardless of the value of
RS.
também:
mawkaccepts abbreviations for any of these options, e.g., “-W i” and “-Wi” …
~$ tail -f auth.log | awk -Wi '/sshd/ && /Accepted/ {system("echo FOUND")}'
FOUND
FOUND