Duas coisas:
-
O código, como está escrito na pergunta, inserirá a string literal
$msg
(se funcionar), já que você usa aspas simples ao redor dela. Use aspas duplas em vez disso. Aqui, coloquei a instrução inteira entre aspas duplas, o que expandirá o$msg
dentro. O código shell ainda é frágil, dependendo do que vem dogrep
. A sequência de caracteres em$msg
deve idealmente ser adequadamente higienizada para que um único'
, ou outros caracteres especiais, não quebre a declaração (ou pior, veja comentário do usuário cas abaixo ).tail -f logfile.log | grep -F 'ERROR' | while read msg; do psql -d testdb -c "insert into t values('$msg')" done
Também adicionei
-F
à invocação degrep
enquanto pesquisamos com uma string fixa (isso é principalmente para fins de documentação). -
grep
armazena em buffer sua saída, portanto, não produzirá nada até que seu buffer de saída esteja cheio. Isso dá a impressão de que "não está funcionando" quando, de fato, ocorre, mas não fará nada até quegrep
tenha liberado seu buffer de saída, o que acontece quando há dados suficientes nele. Esta é uma otimização de desempenho.GNU
grep
(bem como algumas outras implementações do mesmo utilitário, por exemplo, o OpenBSD) pode ser feito com buffer de linha com sua opção--line-buffered
:tail -f logfile.log | grep --line-buffered -F 'ERROR' | while read msg; do psql -d testdb -c "insert into t values('$msg')" done
Nota: Eu não testei isso porque atualmente não tenho uma instância do PostgreSQL (?) em execução.