Eu gostaria de canalizar dados ao vivo do psql para outro comando para fins de monitoramento via shell.
Isso pode ser feito?
Até agora tenho o seguinte:
$ psql bareos -c '\watch (SELECT * FROM log ORDER BY time DESC LIMIT 200) TO STDOUT WITH CSV'
Estou usando o postgres 11.12.
Mas quando executo o comando, acabo com o erro:
\watch cannot be used with an empty query
Considerando que, se eu executá-lo diretamente do psql, é perfeitamente capaz de assistir a saída ao vivo.
Meu objetivo é alcançar a cauda do estilo unix da saída.
Eu tentei várias variações com
-c
e não consegui fazê-lo funcionar. Parece que não tentei variações suficientes ou\watch
simplesmente não funciona compsql -c
.Eu então tentei com
psql -f
(para ler o script sql de um arquivo) e processo de substituição para fornecer o "arquivo" do script sql, e funcionou muito bem.Por exemplo:
ou, se o seu
psql
não suportar a--csv
opção:O
printf
comando envia dois comandos sql parapsql
(oselect
, e depois o\watch
), separados por um caractere de nova linha (\n
). Cada um desses comandos deve ser entre aspas simples separadamente, para que sejam argumentos separados paraprintf
.Observe que o SQL também usa aspas simples em muitos comandos, portanto, se você precisar executar um comando SQL que as use, terá que ter muito cuidado com a forma como cita seus comandos. por exemplo
Neste exemplo, estou usando aspas duplas no primeiro comando SQL para evitar problemas com a string entre aspas
'cas'
. O problema é que aspas duplas no shell permitem a interpolação de variáveis, então você precisa escapar de qualquer nome de variável do shell (por exemplo\$var
, em vez de apenas$var
) se quiser a string literal em vez do valor da variável. por exemploObserve que eu tive que escapar de todas as ocorrências de
$
com a\
para impedir que o shell expandisse partes da string que parecem ser nomes de variáveis.