シェルを介して監視するために、psqlのライブデータを別のコマンドにパイプしたいと思います。
これは可能ですか?
これまで私は以下を持っています:
$ psql bareos -c '\watch (SELECT * FROM log ORDER BY time DESC LIMIT 200) TO STDOUT WITH CSV'
私はPostgres 11.12を使用しています。
ただし、コマンドを実行すると最終的にエラーが発生します。
\watch cannot be used with an empty query
しかし、psqlで直接実行すると、リアルタイム出力を完全に見ることができます。
私の目標は、Unixスタイルの出力テーリングを達成することです。
ベストアンサー1
いくつかのバリエーションを試しましたが、うまく機能-c
しませんでした。十分なバリエーションを試していないか、\watch
機能していないようですpsql -c
。
psql -f
それから(ファイルからSQLスクリプトを読む)を試してみました。プロセスの交換SQLスクリプト「ファイル」を提供すると正常に動作します。
たとえば、
psql --csv -f <(printf '%s\n' \
'SELECT * FROM log ORDER BY time DESC LIMIT 200;' \
'\watch')
またはpsql
この--csv
オプションをサポートしていない場合:
psql -f <(printf '%s\n' \
'\pset format csv' \
'SELECT * FROM log ORDER BY time DESC LIMIT 200;' \
'\watch')
これはprintf
送る二つsqlコマンドは改行文字()で区切られてpsql
(最初にselect
、その後)送信されます。これらの各コマンドは個別に一重引用符で囲む必要があります。\watch
\n
printf
SQLも多くのコマンドで単一引用符を使用するため、単一引用符を使用するSQLコマンドを実行する必要がある場合は、コマンドの引用に非常に注意する必要があります。例えば
psql -f <(printf '%s\n' "select * from table where name='cas'" '\watch 5')
この例では、引用符付き文字列に関連する問題を回避するために、最初のSQLコマンドに二重引用符を使用しました'cas'
。問題は、シェルの二重引用符が変数の補間を可能にするため、変数の値ではなくリテラル文字列が必要な場合は、すべてのシェル変数名(たとえば、\$var
.$var
psql -f <(printf '%s\n' \
"select * from table where pass='\$1\$QsHP.S0S\$1Npjv4aKJZv4IjDD.PgNp/'" \
'\watch 5')
シェルが変数名のように見える文字列部分を拡張するのを防ぐために、$
各項目をaにエスケープする必要がありました。\