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 interactive
sets unbuffered writes to stdout and line buffered reads from stdin. Records from stdin are lines regardless of the value of
RS
.
também:
mawk
accepts 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