Na observação do pôster, um comentário nessa pergunta leva a uma postagem SO em desabilitação do auto- buffering ao usar pipes . A solução foi usar unbuffer (de expect ), como em:
$ unbuffer tail -f foo | find-and-run "findwhat" "runwhat"
A resposta de wfaulk (mais a limpeza de ayrnieu) nos fornece o script find-and-run:
#!/usr/bin/perl
# run: find-and-run "regex-to-find" "commandtorun"
die "usage: $0 <regex> <exec-this> [exec-this-arg1 ...]\n"
unless @ARGV >= 2;
my ($re, @run) = @ARGV;
while (<>) {
last if /$re/;
}
exec { $run[0] } @run;
Nota 1: no Debian lenny, você precisará instalar o pacote "expect-dev"; unbuffer é instalado como "expect_unbuffer".
Nota 2: isto é completamente não testado e completamente ligeiramente ingênuo. por segurança, não use isso. Se você usar isso, provavelmente desejará uma citação simples do seu regex para evitar a substituição / expansão do shell.
Nota 3: muito obrigado ao ayrnieu pela conclusão e limpeza de scripts.