57

I'm using PostgreSQL 9.1.X

I am trying to build psql script to print results without a header but including a footer.

http://www.postgresql.org/docs/9.1/static/app-psql.html

From the document above

\pset tuples_only

will turn both header and footer off. and

\pset footer off

will turn footer off only.

Is there a way in psql to turn the header off and keep the footer on?

I know there are many ways to work around this issue using shell/perl/whatever text tool you like, however I am wondering why there is a config for the footer but not one for the header?

id <--this line I don't want
---- <-- this line I don't want either
 1  <-- this line, yes
(1 row) <-- yes, I want it!
Hannah Vernon
  • 70,928
  • 22
  • 177
  • 323
skong
  • 671
  • 1
  • 5
  • 3

4 Answers4

61

When executing psql from shell you can use -t (prints tuples only) option:

$ psql -t -c "SELECT version();"
 PostgreSQL 9.5.5 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit

Within psql use \t to turn off printing header and row count.

Tombart
  • 1,160
  • 11
  • 23
10

My solution is not quite turning off but rather discarding headers.

You can try to tail the query output:

\o | tail -n +2

With \o, you can redirect output to a file or a pipe, like in this case. This solution has its flaw, too: at least in my case, after execution of SELECT [...], I don't get back to a prompt unless I press a key. And the first output row appears after a prompt. If you then redirect output to a file, it shouldn't be a problem though.

This behaviour can be avoided if you set the PAGER environmental variable appropriately and always use pager is psql:

$ export PAGER='tail -n +3'

$ psql -U postgres -d test
psql (9.1.4, server 9.1.5)

test=# \pset pager always
Pager is always used.

test=# select * from a;
  2 | b
  3 | b
(2 rows)

In the psql version that comes with PostgreSQL 9.2 you can use the \setenv command for convenience (I mean that you don't have to set an env variable which may affect other applications as well).

András Váczi
  • 31,778
  • 13
  • 102
  • 151
5

Have you tried \a, \pset pager off and \pset tuples_only?

Let's start with \a and \pset pager off first:

$ psql
psql (9.3.22, server 10.13)
WARNING: psql major version 9.3, server major version 10.
         Some psql features might not work.
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

=> \a Output format is unaligned. => \pset pager off Pager usage is off. => select version(); version PostgreSQL 10.13 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit (1 row) =>

This removes most of the header formatting but still has the header name.

We introduce \pset tuples_only as well we get:

=> \pset tuples_only
Showing only tuples.
appstudiojobs=> select version();
PostgreSQL 10.13 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
=>

So, this removes everything, i.e. both header and footer.

i.e. still doesn't meet the OP's exact requirements (i.e. header off, footer on), but, it is one step closer.

Stephen Quan
  • 171
  • 1
  • 2
4

You need to add in a psql command line option -P "footer=off". This option keep the columns titles in the result.

Mark Storey-Smith
  • 31,860
  • 9
  • 90
  • 125
Karen Muñoz
  • 75
  • 1
  • 1