Pipe
我可以將實時數據從 postgresql 的 watch 命令傳送到另一個命令嗎?
我想將來自 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 -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
(theselect
,然後是\watch
),由換行符 (\n
) 分隔。這些命令中的每一個都必須單獨用單引號引起來,以便它們是單獨的參數printf
。請注意,SQL 在許多命令中也使用單引號,因此如果您需要執行使用它們的 SQL 命令,則必須非常小心引用命令的方式。例如
psql -f <(printf '%s\n' "select * from table where name='cas'" '\watch 5')
在此範例中,我在第一個 SQL 命令中使用雙引號來避免帶引號的字元串出現任何問題
'cas'
。問題是 shell 中的雙引號允許變數插值,因此如果您想要文字字元串而不是變數的值,則需要轉義任何 shell 變數名稱(例如\$var
,而不是 just )。$var
例如psql -f <(printf '%s\n' \ "select * from table where pass='\$1\$QsHP.S0S\$1Npjv4aKJZv4IjDD.PgNp/'" \ '\watch 5')
$
請注意,我必須使用 a來逃避每次出現的情況,\
以防止 shell 擴展字元串中看起來像是變數名的部分。