2017-07-27 55 views
0

我期待刪除所有來自行繪製字符:psql非選擇:如何刪除格式並只顯示某些列?

PGPASSWORD="..." psql -d postgres -h "1.2.3.4" -p 9432 -c 'show pool_nodes' -U owner 
node_id | hostname | port | status | lb_weight | role 
---------+---------------+------+--------+-----------+--------- 
0  | 10.20.30.40 | 5432 | 2  | 0.500000 | primary 
1  | 10.20.30.41 | 5432 | 2  | 0.500000 | standby 
(2 rows) 

添加-t選項擺脫了頁眉和頁腳,但豎條仍然存在:

PGPASSWORD="..." psql -t -d postgres -h "1.2.3.4" -p 9432 -c 'show pool_nodes' -U owner 
0  | 10.20.30.40 | 5432 | 2  | 0.500000 | primary 
1  | 10.20.30.41 | 5432 | 2  | 0.500000 | standby 

注意此問題特定於show pool_nodes和其他類似的非select SQL語句。

我現在的解決方法是涉及Linux的cut命令:

<previous command> | cut -d '|' -f 4 

的問題有兩個部分:

  1. 如何使用psql只能豎條上述被刪除?
  2. 如何使用psql只能顯示特定列(例如status)或列?例如,結果可能只是兩行,每行顯示數字2

我在CentOS 7服務器上使用psql版本psql (PostgreSQL) 9.2.18

回答

0

對於腳本psql使用psql -qAtX

  • q uiet
  • t uples只
  • A ligned輸出
  • 不讀.psqlrcX

要FILT呃列你必須在SELECT列表中將它們命名。 psql始終輸出從服務器獲得的完整結果集。例如。 SELECT status FROM pool_nodes

或者您可以cut來提取序號列號,例如

psql -qAtX -c 'whatever' | cut -d '|' -f 1,2-4 

(我不知道如何show pool_nodes可以產生你在這裏展示的輸出,因爲SHOW返回一個標值...)

從管道|改變定界符別的東西,使用-F例如-F ','。但要注意,分隔符在輸出時不會被轉義,這不是CSV。您可能想要將選項卡視爲有用的選項;你必須輸入一個帶引號的文字標籤才能做到這一點。 (如果在交互式shell中執行此操作,請在卡住時搜索「如何在bash中輸入文本標籤」)。

示例顯示所有以上,給出的虛擬數據:

CREATE TABLE dummy_table (
    a integer, 
    b integer, 
    c text, 
    d text 
); 

INSERT INTO dummy_table 
VALUES 
(1,1,'chicken','turkey'), 
(2,2,'goat','cow'), 
(3,3,'mantis','cricket'); 

查詢,單空格作爲列分隔符(所以你最好不要在你的數據空間!):

psql -qAtX -F ' ' -c 'SELECT a, b, d FROM dummy_table' 

如果由於某種原因,你不能生成列列表選擇您可以通過列序號與cut,而不是過濾:

psql -qAtX -F '^' -c 'TABLE dummy_table' | cut -d '^' -f 1-2,4 
+0

使用'-qAtX'還包括垂直輸出刪除所有間距的酒吧。不幸的是,這並沒有回答這個問題,我的OP已經顯示了'cut'解決方法(注意:你的-f和-c選項的使用是不正確的)。但是,謝謝你的嘗試! –

+0

呃,腦f重新切割。那麼你打算實現什麼?你的問題有點含糊,因爲簡單地「移除豎條」(管道)不是很有效,而且你不知道你試圖達到的底層目標是什麼。 *輸出列的寬度不固定,取決於輸出數據*所以按char-column範圍切割不能可靠工作。如果您只想更改分隔符,請參閱手冊頁 - 例如「-F」。但請注意,這不會產生CSV - 任何','在數據結果中*都不會被轉義*。 –

+0

詳細說明。也許你應該解釋你的實際潛在目標是什麼? –

相關問題