2017-07-27 54 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

详细说明。也许你应该解释你的实际潜在目标是什么? –

相关问题