How to tweak "dpkg -l" output

I need the fields returned by dpkg -l to be tab separated but without the headers and the "ii" column.

The default output:

$ dpkg -l grep
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  grep           2.16-1       amd64        GNU grep, egrep and fgrep

My desired output:

grep    2.16-1  amd64   GNU grep, egrep and fgrep

Solution 1:

dpkg is not appropriate in your case, prefer the dpkg-query command instead. With the dpkg-query you can select the type of fields you want (and optionally the separator):

$ dpkg-query -W -f='${binary:Package}\t${Version}\t${Architecture}\t${binary:Summary}\n' grep
grep    2.16-1  amd64   GNU grep, egrep and fgrep

See the dpkg-query man page for more options (especially the -f --showformat option)

For reference:

   -W, --show [package-name-pattern...]
          Just like the --list option this will list all packages matching
          the  given  pattern.  However the output can be customized using
          the --showformat option.  The default output  format  gives  one
          line  per  matching package, each line having the name (extended
          with the architecture qualifier for  Multi-Arch  same  packages)
          and installed version of the package, separated by a tab.

   -f, --showformat=format
          This  option  is used to specify the format of the output --show
          will produce. The format is a string that  will  be  output  for
          each package listed.

          In the format string, “\” introduces escapes:

              \n  newline
              \r  carriage return
              \t  tab

          “\” before any other character suppresses any special meaning of
          the following character, which is useful for “\” and “$”.

          Package information can be included by inserting variable refer‐
          ences  to  package  fields  using the syntax “${field[;width]}”.
          Fields are printed right-aligned unless the width is negative in
          which case left alignment will be used. The following fields are
          recognized but they are not necessarily available in the  status
          file  (only internal fields or fields stored in the binary pack‐
          age end up in it):

              Architecture
              Bugs
              Conffiles (internal)
              Config-Version (internal)
              Conflicts
              Breaks
              Depends
              Description
              Enhances
              Essential
              Filename (internal, front-end related)
              Homepage
              Installed-Size
              MD5sum (internal, front-end related)
              MSDOS-Filename (internal, front-end related)
              Maintainer
              Origin
              Package
              Pre-Depends
              Priority
              Provides
              Recommends
              Replaces
              Revision (obsolete)
              Section
              Size (internal, front-end related)
              Source
              Status (internal)
              Suggests
              Tag (usually not in .deb but in repository Packages files)
              Triggers-Awaited (internal)
              Triggers-Pending (internal)
              Version

          The following are virtual fields, generated by  dpkg-query  from
          values from other fields (note that these do not use valid names
          for fields in control files):

              binary:Package
              binary:Summary
              db:Status-Abbrev
              source:Package
              source:Version

          The default format string is  “${binary:Package}\t${Version}\n”.
          Actually,  all  other fields found in the status file (i.e. user
          defined fields) can be requested, too. They will be printed  as-
          is,  though,  no  conversion nor error checking is done on them.
          binary:Package is a special field that will  print  the  package
          name  with an architecture qualifier (like "libc6:amd64") if the
          package has a Multi-Arch field with a value of same, and as such
          its  name could be ambiguous.