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 正規表示式是可能的,但它肯定無法處理很多行。


(我知道可以使用 --queryformat 格式化 rpm 的輸出,但這對我沒有幫助,因為我想通過與rpm -qa一年前生成的列表進行比較來比較我今天安裝的軟體包。 )

答案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 的--qfqueryformat 參數。您給它一個格式字串,您可以在其中包含由 包圍的標籤%{}。您可以使用以下命令查看所有允許的標籤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不會幫助你......為什麼不按照前面的答案之一建議的那樣做並使用它從名稱中分離出版本和架構?這樣,您就可以rpm -qa以 CSV 或製表符分隔格式輸出清單以供以後處理。

相關內容