Você pode fazer algo como:
tail -f example.log | awk '
BEGIN {
n = split("pattern1,pattern2,pattern3,pattern4,pattern5", pats, /,/)
}
{
found=0
for (i in pats) if ($0 ~ pats[i]) {
found=1
delete pats[i]
n--
}
}
found {print; if (!n) exit}'
Observe que awk
sairá assim que tiver visto todos os padrões, mas tail
só sairá (de um SIGPIPE) somente na próxima vez que escrever algo depois disso.
Ou se as linhas não corresponderem a vários padrões e se você não se importar em sair quando todos os padrões forem encontrados, mais curtos, mas menos eficientes:
awk '/pattern1/&&!a++ || /pattern2/&&!b++ || /pattern3/&&!c++ || \
/pattern4/&&!d++ || /pattern5/&&!e++'
Com zsh
e GNU grep
:
(trap '' PIPE;tail -f example.log > >(grep -m1 pattern1) \
> >(grep -m1 pattern2) \
> >(grep -m1 pattern3) \
> >(grep -m1 pattern4) \
> >(grep -m1 pattern5))
Mas observe que as linhas que correspondem a vários padrões serão impressas quantas vezes.