Опция --qf (не путать с сочетанием первичных ключей -qf) или --queryformat в длинном варианте позволяет создавать запросы собственных конструкций любой сложности, хотя этот путь сравнительно более сложен, чем использование атомарных опций. Для создания запроса опции --qf необходимо передать форматную строку, синтаксис которой сходен с C-функцией printf. Базовый синтаксис формата запроса:
Можно комбинировать имена полей (тегов) для вывода более чем одного значения поля для указанного пакета. Также можно добавлять опции форматирования в соответствии с соглашениями C.
Например, для вывода имен всех пакетов используется команда, подобная указанной ниже:
|
# rpm -qa --qf "%{NAME}"
redhat-menusglibccracklibgdbmgmplibacllibjpeglincpcreshadow-
utilslibtermcapfreetypeinfofileutilspsmiscntpmountcracklib-dictskrb5-libscyrus-saslusermodeXftlibpnglibxmllibbonobopythonpygtk2pyxf86configredhat-config-usersredhat-config-keyboardrpm404-pythongnome-vfs2libgnomeuiashbind-utilscyrus-
sasl-plaindos2unixethtoolfingergroffautofskbdconfiglesslibtool-
libslockdevmailcapMAKEDEVmouseconfignetpbmntsysvORBitpartedppppsutilsrdaterhnlibrp
mrshsetuptoolstatserialtarlilopciutilstimeconfigunzipkernel-pcmcia-
csanacronXFree86
|
В этой команде использовался наиболее простой формат и запрашивались только имена пакетов. Для форматирования вывода необходимо добавить символ новой строки после каждого имени в конце форматной строки:
|
# rpm -qa --qf "%{NAME}\n"
redhat-menus
glibc
cracklib
gdbm
gmp
libacl
libjpeg
linc
pcre
shadow-utils
libtermcap
freetype
info
fileutils
psmisc
ntp
mount
cracklib-dicts
krb5-libs
cyrus-sasl
usermode
Xft
|
Для экономии места почти весь вывод опущен. Данная команда выводит то же, что и команда rpm -qa, поэтому взята лишь для примера, как конструируются пользовательские запросы.
В примере ниже показывается, как для каждого запрашиваемого пакета вывести имя и платформу (показано только несколько строк вывода, на каждое поле выделяется 20 символов):
|
# rpm -qa --qf "%-20{NAME} %-20{PLATFORM}\n"
redhat-menus noarch-redhat-linux-gnu
glibc i686-redhat-linux-gnu
cracklib i386-redhat-linux
gdbm i386-redhat-linux-gnu
gmp i386-redhat-linux-gnu
libacl i386-redhat-linux-gnu
libjpeg i386-redhat-linux
linc i386-redhat-linux-gnu
pcre i386-redhat-linux
shadow-utils i386-redhat-linux-gnu
libtermcap i386-redhat-linux
freetype i386-redhat-linux-gnu
info i386-redhat-linux-gnu
fileutils i386-redhat-linux-gnu
psmisc i386-redhat-linux
ntp i386-redhat-linux-gnu
mount i386-redhat-linux-gnu
cracklib-dicts i386-redhat-linux
krb5-libs i386-redhat-linux-gnu
cyrus-sasl i386-redhat-linux-gnu
usermode i386-redhat-linux-gnu
Xft i386-redhat-linux-gnu
|
4.2.10.1 Работа с полями формата запроса
Для построения запроса с помощью опции --queryformat необходимо знать, какие имена полей нам доступны в принципе. Для вывода списка имен доступных тегов используется опция --querytags. В примере ниже показано только несколько строк вывода:
|
# rpm --querytags
NAME
VERSION
RELEASE
SUMMARY
DESCRIPTION
BUILDTIME
|
Каждый из этих тегов имеет также вариант с префиксом, например, RPMTAG_NAME. Вы можете использовать имена полей как с префиксом, так и без оного.
|
$ rpm -q --qf "%{RPMTAG_NAME}\n" sendmail
sendmail
|
Эта команда использует опцию -q для запроса одного пакета вместо -qa (для запроса всех пакетов).
4.2.10.2 Запрос информации о пакете
Множество тегов отвечают за информацию о пакете, которая хранится в хэдере пакета. Таблица ниже содержит список таких полей.
|
Поле
|
Содержит
|
|
NAME
|
Имя пакета
|
|
VERSION
|
Номер версии
|
|
RELEASE
|
Номер релиза
|
|
SUMMARY
|
Однострочный коментарий содержимого пакета
|
|
DESCRIPTION
|
Текст описания пакета (многострочный)
|
|
BUILDTIME
|
Время создания пакета
|
|
BUILDHOST
|
Хост, на котором собран пакет
|
|
SIZE
|
Размер всех обычных файлов в нагрузке
|
|
LICENSE
|
Лицензия, под которой выпущен пакет
|
|
GROUP
|
Группа или категория пакета
|
|
OS
|
Операционная система, под которой пакет собирался
|
|
ARCH
|
Процессорная архитектура, например i386
|
|
SOURCERPM
|
Пакет с исходным кодом из которого собирался бинарный пакет
|
|
CHANGELOGTIME
|
Массив времен изменений журнала
|
|
CHANGELOGNAME
|
Массив имен записей журнала
|
|
CHANGELOGTEXT
|
Массив содержимого записей журнала
|
|
PREIN
|
Скрипт перед установкой
|
|
POSTIN
|
Скрипт после установки
|
|
PREUN
|
Скрипт перед удалением
|
|
POSTUN
|
Скрипт после удаления
|
|
PLATFORM
|
Платформа
|
Все поля, за исключением CHANGELOGTIME, CHANGELOGTEXT и CHANGELOGNAME, это поля, имеющие одно значение. Запросы многозначных полей осуществляются с помощью форматирования массивов.
4.2.10.3 Форматирование массивов
Некоторые записи хэдера представляют собой массивы, то есть содержат более чем одно значение. Для задания запроса каждой записи в массиве используются квадратные скобки. Например:
|
$ rpm -q --queryformat "[%-50{FILENAMES} %{FILESIZES}\n]" sendmail
/etc/aliases 1295
/etc/aliases.db 12288
/etc/mail 4096
/etc/mail/Makefile 748
/etc/mail/access 331
/etc/mail/access.db 12288
/etc/mail/domaintable 0
/etc/mail/domaintable.db 12288
/etc/mail/helpfile 5588
/etc/mail/local-host-names 64
|
Этот пример выводит файлы и размеры файлов пакета sendmail (вывод сокращен для экономии места).
Если в одном запросе необходимо запросить как массивы, так и поля с единственным значением, используется знак равенства в начале тега для указания того, что данный тег должен быть повторен для каждой записи массива. Например:
|
$ rpm -q --queryformat "[%-15{=NAME} %-50{FILENAMES}\n]" sendmail jikes
sendmail /usr/lib/sendmail
sendmail /usr/sbin/mailstats
sendmail /usr/sbin/makemap
sendmail /usr/sbin/praliases
sendmail /usr/sbin/sendmail.sendmail
sendmail /usr/sbin/smrsh
sendmail /usr/share/man/man1/mailq.sendmail.1.gz
sendmail /usr/share/man/man1/newaliases.sendmail.1.gz
sendmail /usr/share/man/man5/aliases.sendmail.5.gz
sendmail /usr/share/man/man8/mailstats.8.gz
sendmail /usr/share/man/man8/makemap.8.gz
sendmail /usr/share/man/man8/praliases.8.gz
sendmail /usr/share/man/man8/rmail.8.gz
sendmail /usr/share/man/man8/sendmail.8.gz
sendmail /usr/share/man/man8/smrsh.8.gz
sendmail /var/spool/clientmqueue
sendmail /var/spool/mqueue
jikes /usr/bin/jikes
jikes /usr/doc/jikes-1.18/license.htm
jikes /usr/man/man1/jikes.1.gz
|
В этом примере за именем пакета следуют имена файлов пакета.
4.2.10.4 Специальные форматы
Некоторые поля содержат специальную информацию в бинарном виде, которую не имеет смысла выводить в том виде, в каком она есть. Для обработки подобных случаев используется такой синтаксис:
Например, для вывода INSTALLTIME применяется %{INSTALLTIME:date}, спецификация для вывода значения времени в формате date. Например:
|
$ rpm -q --qf "%{NAME}-%{VERSION}-%{RELEASE} %{INSTALLTIME:date}\n" jikes
jikes-1.18-1 Fri 06 Dec 2002 09:19:30 PM CST
|
Этот пример выводит Имя-Версию-Релиз вместе с датой установки.
Большая часть тегов в хэдере является опциональной. Можно выводить их значения, но если тег не задан, команда не выведет ничего. Для обработки этого случая можно использовать условный оператор, базирующийся на синтаксисе C:
|
%|tag?{print_if_present}:{print_if_absent}|
|
Если использовать обычный синтаксис %{tag}, этот условный синтаксис будет очень быстро усложняться. Следует разделять элементы. Например:
|
$ rpm -q --qf "%{NAME} %|EPOCH?{%{EPOCH}}:{(no Epoch)}|\n" perl
perl 1
|
Если пакет имеет не пустое поле EPOCH, мы увидим вывод как в примере. Большая часть пакетов не имеет этого поля. В случае, когда EPOCH не определено, мы увидим пустой вывод perl (no Epoch).
4.2.10.5 Запрос зависимостей пакета
Ряд тегов отвечает за информацию о зависимостях пакета. Каждый из этих тегов существует в рамках триплетов, которые форматируются сходным образом. Например, для возможностей, которые требует пакет, имеются поля REQUIRENAME, REQUIREVERSION и REQUIREFLAGS.
REQUIRENAME хранит имя требуемой возможности, REQUIREVERSION - массив подходящих версий, REQUIREFLAGS соединяет значения двух предыдущих полей на основании битовых флагов, которые задают статус зависимости в терминах "имеющаяся версия больше нужной", "имеющаяся версия равна нужной", "имеющаяся версия меньше нужной".
В таблице ниже перечислены теги зависимостей.
|
Поле
|
Содержит
|
|
CONFLICTFLAGS
|
Массив флагов для возможностей, с которыми пакет конфликтует
|
|
CONFLICTNAME
|
Массив имен возможностей, с которыми пакет конфликтует
|
|
CONFLICTVERSION
|
Массив номеров версий возможностей, с которыми пакет конфликтует
|
|
REQUIREFLAGS
|
Массив флагов возможностей, в которых пакет нуждается
|
|
REQUIRENAME
|
Массив имен возможностей, в которых пакет нуждается
|
|
REQUIREVERSION
|
Массив номеров версий возможностей, в котрых пакет нуждается
|
|
OBSOLETENAME
|
Массив имен возможностей, которые пакет делает неактуальными
|
|
OBSOLETEFLAGS
|
Массив флагов возможностей, которые пакет делает неактуальными
|
|
OBSOLETEVERSION
|
Массив номеров версий возможностей, которые пакет делает неактуальными
|
|
PROVIDENAME
|
Массив имен возможностей, которые пакет предоставляет
|
|
PROVIDEFLAGS
|
Массив флагов возможностей, которые пакет предоставляет
|
|
PROVIDEVERSION
|
Массив номеров версий возможностей, которые пакет предоставляет
|
Каждый из этих тегов - массив. Специальная опция форматирования флагов depflags представляет бинарные флаги в удобочитаемом формате. Например, следующая команда выводит зависимости пакета:
|
$ rpm -q --qf \
"[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]" sendmail
rpmlib(VersionedDependencies) <= 3.0.3-1
chkconfig >= 1.3
/usr/sbin/useradd
/bin/mktemp
fileutils
gawk
sed
sh-utils
procmail
bash >= 2.0
/bin/sh
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
|
Для тех зависимостей, которые имеют конкретную версию, эта команда выведет номер версии, предшествуемый оператором сравнения. Обратите внимание, что многие зависимости не имеют специфических требований по версии.
Кроме обычных зависимостей пакеты также могут зависеть от специфической версии RPM, поскольку зависят от какой-либо специфической возможности, например, rpmlib, предоставляющей CompressedFileNames.
4.2.10.6 Запрос информации о файлах
Поля данных о файлах содержат информацию, касающуюся файлов нагрузки, то есть тех файлов, которые будут установлены в систему. Это массивы, содержащие по одному значению на файл.
|
Поле
|
Содержит
|
|
OLDFILENAMES
|
Массив полных имен файлов, использовавшихся в старых версиях пакета
|
|
FILESIZES
|
Массив размеров файлов
|
|
FILEMODES
|
Массив прав доступа на каждый файл
|
|
FILERDEVS
|
Массив значений rdev на каждый файл
|
|
FILEMTIMES
|
Массив времени последнего изменения каждого файла
|
|
FILEMD5S
|
Даджест MD5 для каждого файла
|
|
FILELINKTOS
|
Массив информации о ссылках для каждого файла
|
|
FILEFLAGS
|
Массив флагов для каждого файла
|
|
FILEUSERNAME
|
Массив имен владельцев каждого файла
|
|
FILEGROUPNAME
|
Массив имен групп владельцев каждого файла
|
|
FILEDEVICES
|
Массив устройств каждого файла
|
|
FILEINODES
|
Массив индексных дескрипторов каждого файла
|
|
FILELANGS
|
Массив флагов языка каждого файла
|
|
DIRINDEXES
|
Массив индексов каталогов каждого файла (ассоциируют DIRNAMES и BASENBAMES)
|
|
BASENAMES
|
Массив базовых имен
|
|
DIRNAMES
|
Массив каталогов, которые ассоциируются с BASENAMES
|
OLDFILENAMES, в том случае, если REQUIRENAME не указывает на rpmlib(CompressedFileNames), используется, если имеют место несжатые файлы.
FILESIZES задает размер всех файлов в нагрузке, в то время как FILEMODES специфицирует права доступа. FILEMTIMES хранит время последней модификации каждого файла.
BASENAMES хранит массив базовых имен файлов в нагрузке, а DIRNAMES - имена каталогов для этих файлов. DIRINDEXES содержит индексы для каталогов из DIRNAMES.
Каждый rpm-пакет должен иметь или OLDFILENAMES или триплет BASENAMES, DIRNAMES, DIRINDEXES, но не то и другое вместе.
4.2.10.7 Прочие теги для форматирования запроса
Кроме вышеперечисленных, существует еще ряд полей различного назначения, большая часть которых показана в таблице ниже.
|
Поле
|
Содержит
|
|
ARCHIVESIZE
|
Размер несжатой секции нагрузки
|
|
COOKIE
|
Скрытая строка специального назначения
|
|
RPMVERSION
|
Версия RPM, с помощью которой пакет был собран
|
|
OPTFLAGS
|
Флаги оптимизации компилятора при сборке пакета
|
|
PAYLOADFORMAT
|
Must be cpio for LSB-compliant packages
|
|
PAYLOADCOMPRESSOR
|
Для совместимости с LSB всегда имеет значение gzip
|
|
PAYLOADFLAGS
|
Для совметсимости с LSB должно иметь значение 9
|
|
RHNPLATFORM
|
Скрытая строка специального назначения
|
|
FILEVERIFYFLAGS
|
Битовая маска, указывающая, какие тесты должны проводится для проверки файлов после установки
|
С помощью этих тегов можно, например, запросить, с помощью каких версий RPM создавались пакеты:
|
$ rpm -qp --qf "%{name} - rpm %{rpmversion}\n" *.rpm
acroread - rpm 2.5.5
canvas - rpm 3.0.3
jikes - rpm 4.0.2
SDL - rpm 2.5.1
ted - rpm 2.5.5
|
-p указывает на файлы rpm-пакетов в текущем каталоге, а не на установленные пакеты.
Далее - Прочие запросы
Назад - Комбинирование запросов
Содержание