我希望从以下位置删除所有线描字符:
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 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/