
Ich schreibe ein kleines Programm, das Konfigurationsdateien als RPM verpackt, und es fügt eine Reihe von %Triggern ein, um die Installation/Aktualisierung der Pakete zu handhaben, die eine Kopie/Version derselben Datei mitbringen.
Ich komme nicht weiter, wenn ich versuche, die von Yum bereitgestellte Ausgabe zu formatieren. Die Standardausgabe ist:
# 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
Aber ich brauche nur den Paketnamen. Die Verwendung cut
scheint keine gute Idee zu sein. Das Trennzeichen wäre -, aber es gibt mehrere Pakete mit einem - in der Mitte des Paketnamens.
Idealerweise müsste die Ausgabe formatierbar sein, wie für RPM-Abfragen:
rpm -qa --queryformat "%{NAME}\n"
make
rubygem-multi_json
attr
ncurses-base
rubygem-rack-test
strace
rubygem-polyglot
gpg-pubkey
rubygem-journey
tzdata
...
Antwort1
Sie werden zufriedener sein, wenn Sie yum
stattdessen den repoquery
Befehl aus dem yum-utils
Paket verwenden. Damit führen Sie einfach Folgendes aus:
$ repoquery --whatprovides '*/named.conf' --qf '%{NAME}'
Auf meinem System wird Folgendes zurückgegeben:
bind
sblim-cmpi-dns-test
bind
bind-chroot
rubygem-openshift-origin-dns-bind
system-config-bind
logwatch
bind-chroot
Antwort2
Ich habe mit verschiedenen Yum-Befehlen, sed, grep und cut eine hässliche Lösung für dieses Problem gefunden:
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
Dann habe ich Duplikate aus dem Array entfernt
arr3=$(echo "${arr2[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
Mit meinen derzeitigen Bash-Kenntnissen ist es das Beste, was ich tun konnte.