
Я пишу небольшую программу, которая упаковывает файлы конфигурации в формате RPM и помещает ряд %триггеров для управления установкой/обновлением пакетов, которые приносят копию/версию одного и того же файла.
Я застрял, пытаясь отформатировать вывод yum. Вывод по умолчанию:
# yum provides */named.conf -q
32:bind-chroot-9.8.2-0.17.rc1.el6_4.6.i686 : A chroot runtime environment for the ISC BIND DNS server, named(8)
Repo : base
Matched from:
Filename : /var/named/chroot/etc/named.conf
sblim-cmpi-dns-test-1.0-1.el6.i686 : SBLIM WBEM-SMT Dns - Testcase Files
Repo : base
Matched from:
Filename : /usr/share/sblim-testsuite/named.conf
Но мне нужно только имя пакета. Использование cut
не кажется хорошей идеей. Разделителем будет -, но есть несколько пакетов с - в середине имени пакета.
В идеале мне нужно, чтобы вывод можно было форматировать, как для запросов rpm:
rpm -qa --queryformat "%{NAME}\n"
make
rubygem-multi_json
attr
ncurses-base
rubygem-rack-test
strace
rubygem-polyglot
gpg-pubkey
rubygem-journey
tzdata
...
решение1
Вы будете счастливее, если откажетесь yum
от repoquery
команды из yum-utils
пакета. С этим вы просто запускаете:
$ repoquery --whatprovides '*/named.conf' --qf '%{NAME}'
Что в моей системе возвращает:
bind
sblim-cmpi-dns-test
bind
bind-chroot
rubygem-openshift-origin-dns-bind
system-config-bind
logwatch
bind-chroot
решение2
Я придумал ужасное решение этой проблемы, используя различные команды yum, sed, grep и cut:
PKLIST=`yum provides -q */$FILE | grep -v 'Repo\|Matched\|Filename' | sed "s/32://g" | cut -d':' -f1 | sed "s/ //g" | grep -e '^$' -v`
array=($PKLIST)
arr2=()
for i in "${array[@]}"
do
x=`yum info -C $i | grep "Name :" | sed "s/Name : //g"`
arr2+=($x)
done
Затем я удалил дубликаты из массива.
arr3=$(echo "${arr2[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
С моими текущими знаниями Bash это лучшее, что я мог сделать.