我正在编写一个小程序,将配置文件打包为 rpm,并设置一系列 %trigger 来处理带来同一文件副本/版本的软件包的安装/升级。
我无法格式化 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 知识,这是我能做的最好的事情。