summaryrefslogtreecommitdiff
path: root/doc/manual/queryformat
blob: b6f6e25113c2401fac691aec3717eb86ad33607e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*! \page queryformat Query formats

As it is impossible to please everyone with one style of query output, RPM
allows you to specify what information should be printed during a query
operation and how it should be formatted.

\subsection queryformat_tags Tags

All of the information a package contains, apart from signatures and the
actual files, is in a part of the package called the header. Each piece
of information in the header has a tag associated with it which allows
RPM to to tell the difference between the name and description of a
package.

To get a list of all of the tags your version of RPM knows about, run the
command 'rpm --querytags'. It will print out a list like (but much longer
then) this:

\verbatim
    RPMTAG_NAME
    RPMTAG_VERSION
    RPMTAG_RELEASE
    RPMTAG_SERIAL
    RPMTAG_SUMMARY
    RPMTAG_DESCRIPTION
    RPMTAG_BUILDTIME
    RPMTAG_BUILDHOST
    RPMTAG_INSTALLTIME
    RPMTAG_SIZE
\endverbatim

As all of these tags begin with RPMTAG_, you may omit it from query format
specifiers and it will be omitted from the rest of this documentation for
the same reason.

A tag can consist of one element or an array of elements. Each element can
be a string or number only.

\subsection queryformat_format Query Formats

A query format is passed to RPM after the --queryformat argument, and normally
should be enclosed in single quotes. This query format is then used to print
the information section of a query. This means that when both -i and 
--queryformat are used in a command, the -i is essentially ignored. 
Additionally, using --queryformat implies -q, so you may omit the -q as well.

The query format is similar to a C style printf string, which the printf(2)
man page provides a good introduction to. However, as RPM already knows the
type of data that is being printed, you must omit the type specifier. In
its place put the tag name you wish to print enclosed in curly braces
({}). For example, the following RPM command prints the names and sizes
of all of the packages installed on a system:

\verbatim
    rpm -qa --queryformat "%{NAME} %{SIZE}\n"
\endverbatim

If you want to use printf formatters, they go between the % and {. To
change the above command to print the NAME in the first 30 bytes and
right align the size to, use:

\verbatim
    rpm -qa --queryformat "%-30{NAME} %10{SIZE}\n"
\endverbatim

\subsection queryformat_arrays Arrays

RPM uses many parallel arrays internally. For example, file sizes and 
file names are kept as an array of numbers and an array of strings
respectively, with the first element in the size array corresponding
to the first element in the name array. 

To iterate over a set of parallel arrays, enclose the format to be used
to print each item in the array within square brackets ([]). For example,
to print all of the files and their sizes in the slang-devel package
followed by their sizes, with one file per line, use this command:

\verbatim
    rpm -q --queryformat "[%-50{FILENAMES} %10{FILESIZES}\n]" slang-devel
\endverbatim

Note that since the trailing newline is inside of the square brackets, one
newline is printed for each filename.

A popular query format to try to construct is one that prints the
name of a package and the name of a file it contains on one line, 
repeated for every file in the package. This query can be very useful
for passing information to any program that's line oriented (such as
grep or awk). If you try the obvious,

\verbatim
    rpm --queryformat "[%{NAME} %{FILENAMES}\n]" cdp
\endverbatim

If you try this, you'll see RPM complain about a "parallel array size 
mismatch". Internally, all items in RPM are actually arrays, so the NAME
is a string array containing one element. When you tell RPM to iterate
over the NAME and FILENAMES elements, RPM notices the two tags have 
different numbers of elements and complains.

To make this work properly, you need to tell RPM to always print the first
item in the NAME element. You do this by placing a '=' before the tag
name, like this:

\verbatim
    rpm --queryformat "[%{=NAME} %{FILENAMES}\n]" cdp
\endverbatim

which will give you the expected output.

\verbatim
    cdp /usr/bin/cdp
    cdp /usr/bin/cdplay
    cdp /usr/man/man1/cdp.1
\endverbatim

\subsection queryformat_formatting Formatting Tags

One of the weaknesses with query formats is that it doesn't recognize
that the INSTALLTIME tag (for example) should be printed as a date instead
of as a number. To compensate, you can specify one of a few different
formats to use when printing tags by placing a colon followed the formatting 
name after the tag name. Here are some examples:

\verbatim
    rpm -q --queryformat "%{NAME} %{INSTALLTIME:date}\n" fileutils
    rpm -q --queryformat "[%{FILEMODES:perms} %{FILENAMES}\n]" rpm
    rpm -q --queryformat \
	"[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]" \
	vlock
\endverbatim

The :shescape may be used on plain strings to get a string which can pass
through a single level of shell and give the original string.

\subsection queryformat_expressions Query Expressions

Simple conditionals may be evaluated through query expressions. Expressions
are delimited by %|...|. The only type of expression currently supported
is a C-like ternary conditional, which provides simple if/then/else
conditions. For example, the following query format display "present" if
the SOMETAG tag is present, and "missing" otherwise:

\verbatim
    %|SOMETAG?{present}:{missing}|
\endverbatim

Notice that the subformats "present" and "missing" must be inside of curly
braces.

\subsection queryformat_example Example: Viewing the Verify Flags

The following example query is run against dev because I know %verify
is used there.
\verbatim
	rpm -q --qf '[%{filenames} %{fileverifyflags}\n]' dev
\endverbatim

The flags are defined in rpmlib.h (check there for changes):
\verbatim
	#define RPMVERIFY_MD5           (1 << 0)
	#define RPMVERIFY_FILESIZE      (1 << 1)
	#define RPMVERIFY_LINKTO        (1 << 2)
	#define RPMVERIFY_USER          (1 << 3)
	#define RPMVERIFY_GROUP         (1 << 4)
	#define RPMVERIFY_MTIME         (1 << 5)
	#define RPMVERIFY_MODE          (1 << 6)
	#define RPMVERIFY_RDEV          (1 << 7)
\endverbatim

A 1 bit in the output of the query means the check is enabled.

*/