Pipe

我可以將實時數據從 postgresql 的 watch 命令傳送到另一個命令嗎?

  • May 3, 2022

我想將來自 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(the select,然後是\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 擴展字元串中看起來像是變數名的部分。

引用自:https://unix.stackexchange.com/questions/701207