「yum 提供」の出力をフォーマットする

「yum 提供」の出力をフォーマットする

私は、設定ファイルを rpm としてパッケージ化する小さなプログラムを作成しています。このプログラムは、同じファイルのコピー/バージョンをもたらすパッケージのインストール/アップグレードを処理するために、一連の %triggers を配置します。

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に切り替えれば、もっと満足できるでしょう。これを実行するだけで済みます。repoqueryyum-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 の知識では、これが私にできる最善のことです。

関連情報