題 從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 一年前生成的列表。)


4
2017-12-17 21:47


起源


你的意思是版本,發布, 和 拱門。 - Ignacio Vazquez-Abrams
是的,我願意。我會更新這個問題。 - hlovdal


答案:


既然你已經蠢蠢欲動了,你需要從去年開始廢棄這些垃圾。 如果 它足夠一致,永遠是股票格式,在這裡你去:

#!/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, e: # Well nuts...
    print '%s ** %s' % (e, line)
    continue
  print wover

只需將去年的垃圾重定向到它,你就會得到重要的名字。


5
2017-12-18 02:28





你可以使用rpm --qf queryformat參數。你給它一個格式字符串,你可以在其中包含標籤 %{}。您可以看到所有允許的標籤 rpm --querytags

我猜你想要的東西是這樣的:

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

6
2017-12-17 23:41



正如我在問題的最後指出的那樣,這對我沒有幫助。 - hlovdal
如果你是那個能夠停靠答案的人(我自己和另一個人),根據我們沒有看到的規範(不確定它是否在我回答之後添加)來進行downvote是不禮貌的。這是一個簡單的sed請求。就像是 sed 's/-[0-9].*\.(x86|x86_64)$//' 將作為一個起點。 - Rich Homolka
關於格式化rpm輸出的註釋是從一開始就有的(我之後只添加了“with --queryformat”),你可以查看要檢查的歷史記錄, superuser.com/posts/223248/revisions - hlovdal
也許對於downvote是不禮貌的,但對於“請不要回答X”的問題,我認為這是適當的政策來貶低(純粹的)X答案(也考慮到我可能會覺得回答這個問題有點不禮貌我說我不想要)。 - hlovdal
正則表達式不會那麼簡單(我認為正則表達式是錯誤的工具)。我目前正在使用's / - [0-9] \ +(\。[0-9_a-z] \ +)* - [0-9] \ +(\。[0-9a-z])*。 [^。] \ +。[0-9] \ +。[^。] \ + $ //',但這個RE無法匹配和更新的行數很多。 - hlovdal


這遠非完美,但值得一試。

$ 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腳本類似。


6
2017-12-18 02:37



雖然答案中沒有明確說明,但是使用給定的sed命令創建舊列表文件。 - hlovdal
謝謝。雖然不如你所說的那麼完美(我看到它有點太高興去除部件所以例如fedora-package-config-smart最終只是fedora-package-config),它的工作方式比sed正則表達式更好想出了,與Ignacio Vazquez-Abrams的回答一起,我可以比較和合併(使用kdiff3)。 - hlovdal
@hlovdal:實際上,我打算將舊列表原樣創建,而不進行進一步處理。 - Dennis Williamson


rpm是一個非常靈活的命令,帶有許多有用的選項。

例如,您可能希望使用以下方法顯示每個包的安裝日期:

rpm -qa --queryformat '%{NAME}  %{INSTALLTIME:date}\n'

--qf 是簡短的形式 --queryformat

看一下:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html


1
2017-12-17 23:53



正如我在問題的最後指出的那樣,這對我沒有幫助。 - hlovdal


不確定你為什麼這麼想 --queryformat 不會幫助你...為什麼不做以前的答案之一建議並使用它從名稱中分離出版本和架構?這樣,你可以輸出 rpm -qa 以CSV或製表符分隔格式列出,以便以後處理。


0
2017-12-18 00:08



關鍵是我已經有了一些現有的文件 rpm -qa 很久以前,如果沒有時間機器,我無法返回並使用--queryformat重新創建這些文件。這就是為什麼。 - hlovdal


我喜歡上面這是完美的,到目前為止最簡單,但我希望得到一個列表並將其安裝在另一台機器上,所以我這樣做:

rpm -qa --qf "%{NAME} " >installed-rpms.txt

然後我在下一台機器上執行此操作:

yum -y install $(cat installed-rpms.txt)

我必須添加-y,因為我真的想要這麼做,我確信rpm列表是我想要的。


0
2018-04-26 23:08