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$msgdentro. O código shell ainda é frágil, dependendo do que vem dogrep. A sequência de caracteres em$msgdeve 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')" doneTambém adicionei
-Fà invocação degrepenquanto pesquisamos com uma string fixa (isso é principalmente para fins de documentação). -
Ogreparmazena 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é quegreptenha 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.