【问题标题】:psql non-select: how to remove formatting and show only certain columns?psql 非选择:如何删除格式并仅显示某些列?
【发布时间】:2018-01-03 06:38:35
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql psql pgpool


    【解决方案1】:

    对于脚本psql 使用psql -qAtX

    • quiet
    • tuples-only
    • unAaligned 输出
    • 请勿阅读.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
    

    【讨论】:

    • 使用-qAtX 的输出仍然包括删除所有间距的垂直条。不幸的是,这不能回答问题,我的 OP 已经显示了 cut 解决方法(注意:您的 -f 和 -c 选项使用不正确)。但是,感谢您的尝试!
    • 呃,brainfart re cut。那么你打算达到什么目的呢?您的问题有点含糊,因为简单地“删除垂直条”(管道)并不是很有效,并且不清楚您这样做要达到的基本目标是什么。 输出列宽不固定,取决于输出数据,所以cuting by char-column range 不会可靠地工作。如果您只想更改分隔符,请参阅手册页 - 例如 -F ,。但请注意,这不会生成 CSV - 数据结果中的任何 ,未转义
    • 详细说明。也许您应该解释一下您的实际基本目标是什么?
    • show pool_nodes的特定情况下,列的每个数据值都不会有空格。我宁愿输出没有竖线,以便输出只是数据。我不关心输出是可变长度的事实。而且,虽然cut 解决方法可以让我选择单个列(由于垂直条而调整或不调整),但 OP 正在寻找一种解决方案,使我能够从 show pool_nodes 查询中选择特定列(对于例如,仅显示 status 列)
    • 但是......使用SELECT,这就是它的用途。 “show pool_nodes”不是一个有效的查询,真正的查询是什么?这些都没有意义
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2019-06-21
    • 2012-08-08
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多