rpm -qa からの出力で、パッケージ名のみを抽出するにはどうすればよいでしょうか?

rpm -qa からの出力で、パッケージ名のみを抽出するにはどうすればよいでしょうか?

コマンドからの出力形式はrpm -qa次のようになります。

abrt-1.1.14-1.fc14.x86_64
abrt-addon-ccpp-1.1.14-1.fc14.x86_64
abrt-addon-kerneloops-1.1.14-1.fc14.x86_64
abrt-addon-python-1.1.14-1.fc14.x86_64
abrt-desktop-1.1.14-1.fc14.x86_64
abrt-gui-1.1.14-1.fc14.x86_64
abrt-libs-1.1.14-1.fc14.x86_64
abrt-plugin-bugzilla-1.1.14-1.fc14.x86_64
abrt-plugin-logger-1.1.14-1.fc14.x86_64
abrt-plugin-runapp-1.1.14-1.fc14.x86_64

バージョン、リリース、アーキテクチャの部分を確実に削除して、

abrt
abrt-addon-ccpp
abrt-addon-kerneloops
abrt-addon-python
abrt-desktop
abrt-gui
abrt-libs
abrt-plugin-bugzilla
abrt-plugin-logger
abrt-plugin-runapp

私はむしろ、sed 用の正規表現を構築しようとはしません。super-3d-editor-0.1-1.fc14.x86_64 などの名前をサポートするには複雑になると予想されるからです。このようなフィルタリングを望んでいるのは私が初めてではないことは確かです。そのため、すでに何らかの解決策が存在するかどうかを確認するためにここで質問します。

アップデート: 上記の「または類似の」という注記は、rpm パッケージ名がどのようなものかに関するある程度の知識を意味します。それらのほとんどは、上記で示したもののように「見栄えが良い」ものですが、より多様な番号付けスキームを持つエントリもあります。

fxload-2002_04_11-9.fc12.x86_64
GitPython-0.2.0-0.3.beta1.fc14.noarch
ModemManager-0.4-4.git20100720.fc14.x86_64
python-peak-rules-0.5a1.dev-12.a1.dev.20100803svn2646.fc14.noarch
pytz-2010h-3.fc14.noarch

また、バージョン番号が名前の一部になっているパッケージも存在することに注意してください。

java-1.5.0-gcj-1.5.0.0-34.fc14.x86_64
java-1.6.0-openjdk-1.6.0.0-49.1.9.3.fc14.x86_64
java-1.6.0-openjdk-devel-1.6.0.0-49.1.9.3.fc14.x86_64

リリース/アーキテクチャが欠落しているものもあります (これらは処理が難しいかもしれませんが、処理に失敗することは許容できます)

bouml-doc-4.3.2-3.noarch
fedora-release-14-1.noarch
glibc-2.12.90-21.i686
basesystem-10.0-3.noarch
ivtv-firmware-20080701-20.noarch
gpg-pubkey-97a1071f-4c49d6fe

そのため、私はこれを実行するための信頼できる方法を尋ねました。近似的な sed 正規表現を作成することは可能だが、多くの行を処理するには失敗するはずだとわかっていました。


rpm -qa(rpm からの出力を --queryformat でフォーマットできることは知っていますが、 1 年前に生成されたリストと比較して、今日インストールしたパッケージを比較したいので、それは役に立ちません。)

答え1

すでに太っているのだから、去年の無駄な部分を切り落とす必要がある。もし常に標準フォーマットのままで十分一貫性があります。以下をご覧ください。

#!/usr/bin/python

import sys

for line in sys.stdin:
  if line.startswith('gpg-pubkey-'):
    continue # We don't care about imported keys. G'bye!
  try:
    woarch = line.rsplit('.', 1)[0] # Bye, arch!
    worel = woarch.rsplit('-', 1)[0] # Bye, release!
    wover = worel.rsplit('-', 1)[0] # Bye, version!
  except Exception as e: # Well nuts...
    print ('%s ** %s') % (e, line)
    continue
  print (wover)

去年のくだらない情報をそこにリダイレクトするだけで、重要な名前だけが表示されます。

答え2

rpmのqueryformatパラメータを使うことができます--qf。タグを囲むフォーマット文字列を指定します%{}。許可されているタグはすべて次のように表示されます。rpm --querytags

次のようなものが欲しいと思います:

rpm -qa --qf "%{NAME}\n"

答え3

これは完璧とは程遠いですが、試してみる価値はあります。

$ rpm -qa --qf "%{NAME}\n" > currentlist
$ join -t . -v 1 oldlist currentlist    # show packages in oldlist not in currentlist
$ join -t . -v 2 oldlist currentlist    # show packages in currentlist not in oldlist

このsedコマンドは、「多様な」というラベルを付けたグループを除くすべてのグループに対して機能します。

sed 's/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'

これは Ignacio の Python スクリプトと同様に動作すると思います。

答え4

--queryformatなぜ役に立たないと思うのかわかりませんが、前の回答の 1 つで提案されているように、名前からバージョンとアーキテクチャを分離して使用してみてはいかがでしょうか。そうすれば、rpm -qa後で処理するために、リストを CSV またはタブ区切り形式で出力できます。

関連情報