我希望从以下位置删除所有线描字符:

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

问题有两部分:
  • 怎么只用psql才能去掉上面的竖线?
  • 如何使用 psql only 只能显示特定的列(例如 status )或列?例如,结果可能只有两行,每行都显示数字 2

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

    最佳答案

    对于脚本 psql 使用 psql -qAtX :

  • q uiet
  • t uples-only
  • un A 对齐输出
  • 不读 .psqlrc ( X )

  • 要过滤列,您必须在 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'
    

    如果由于某种原因您无法为 SELECT 生成列列表,您可以使用 cut 按列序数进行过滤:
    psql -qAtX -F '^' -c 'TABLE dummy_table' | cut -d '^' -f 1-2,4
    

    关于postgresql - psql 非选择 : how to remove formatting and show only certain columns?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45352374/

    10-15 20:43