如何隐藏psql输出中的列名和行数?
我正在通过psql运行SQL查询:
psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"
我希望输出如下:
1,abc
2,def
3,xyz
但我得到了:
id,text
-------
1,abc
2,def
3,xyz
(3 rows)
当然,在事实之后过滤掉前两行和底行不是不可能的,但是有没有办法只用psql来做?阅读其手册页,我看到了控制字段分隔符的选项,但没有隐藏无关输出的内容。
答案 0 :(得分:65)
您可以使用-t
或--tuples-only
选项:
psql --user=myuser -d mydb --output=result.txt -t -c "SELECT * FROM mytable;"
已修改(一年多以后)添加:
您也可以查看the COPY
command。我不再需要任何PostgreSQL实例来测试,但我认为你可以按照这些方式写一些东西:
psql --user=myuser -d mydb -c "COPY mytable TO 'result.txt' DELIMITER ','"
(除了result.txt
需要是绝对路径)。 COPY
命令还支持更智能的CSV格式;见its documentation。
答案 1 :(得分:17)
您还可以从psql中重定向输出并使用相同的选项。使用\ o设置输出文件,使用\ t输出元组(或\pset
仅关闭rowcount"页脚")。
\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o
可替换地,
\o /home/flynn/queryout.txt
\pset footer off
. . .
答案 2 :(得分:1)
通常when you want to parse the psql generated output您需要设置-A
和-F
...
# generate t.col1, t.col2, t.col3 ...
while read -r c; do test -z "$c" || echo , $table_name.$c | \
perl -ne 's/\n//gm;print' ; \
done < <(cat << EOF | PGPASSWORD=${postgres_db_useradmin_pw:-} \
psql -A -F -v -q -t -X -w -U \
${postgres_db_useradmin:-} --port $postgres_db_port --host $postgres_db_host -d \
$postgres_db_name -v table_name=${table_name:-}
SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'public'
AND table_name =:'table_name' ;
EOF
)
echo -e "\n\n"
您可以找到完整的bash调用here的示例: