我想将来自 psql 的实时数据通过管道传输到另一个命令中,以便通过 shell 进行监控。
这可以做到吗?
到目前为止,我有以下内容:
$ 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 风格的拖尾。
我尝试了几种变体,
-c
但无法正常工作。看起来要么我没有尝试足够多的变化,要么\watch
就是无法使用psql -c
.然后我尝试使用
psql -f
(从文件中读取 sql 脚本)并处理替换以提供 sql 脚本“文件”,它工作得很好。例如:
或者,如果您
psql
不支持该--csv
选项:该
printf
命令将两个sql 命令发送到psql
(theselect
,然后是\watch
),由换行符 (\n
) 分隔。这些命令中的每一个都必须单独用单引号引起来,以便它们是单独的参数printf
。请注意,SQL 在许多命令中也使用单引号,因此如果您需要运行使用它们的 SQL 命令,则必须非常小心引用命令的方式。例如
在此示例中,我在第一个 SQL 命令中使用双引号来避免带引号的字符串出现任何问题
'cas'
。问题是 shell 中的双引号允许变量插值,因此如果您想要文字字符串而不是变量的值,则需要转义任何 shell 变量名称(例如\$var
,而不是 just )。$var
例如$
请注意,我必须使用 a来逃避每次出现的情况,\
以防止 shell 扩展字符串中看起来像是变量名的部分。