rpm -qa 输出,如何只提取包名?

hlo*_*dal 6 rpm

命令的输出格式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
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何可靠地删除版本、发布和架构部分,以便我最终得到

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
Run Code Online (Sandbox Code Playgroud)

我宁愿避免尝试为 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
Run Code Online (Sandbox Code Playgroud)

另请注意,存在版本号是名称的一部分的软件包,例如

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
Run Code Online (Sandbox Code Playgroud)

甚至还有一些缺少发布/架构(这些可能很难处理,我可以接受无法处理这些)

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
Run Code Online (Sandbox Code Playgroud)

这就是为什么我要求一种可靠的方法来做到这一点;我知道创建一个近似的 sed 正则表达式是可能的,但它肯定无法处理很多行。


(我知道可以使用 --queryformat 对 rpm 的输出进行格式化,但这对我没有帮助,因为我想通过与一rpm -qa年前生成的列表进行比较来比较我今天安装的软件包。 )

Ric*_*lka 11

您可以使用 rpm 的--qfqueryformat 参数。你给它一个格式字符串,你可以在其中包含由%{}. 你可以看到所有允许的标签rpm --querytags

我猜你会想要这样的东西:

rpm -qa --qf "%{NAME}\n"
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 6

既然你已经被骗了,你需要摆脱去年的废话。如果它足够一致以始终采用库存格式,那么您就可以:

#!/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)
Run Code Online (Sandbox Code Playgroud)

只需将去年的废话重定向到它,你就会得到重要的名字。


Den*_*son 6

这远非完美,但值得一试。

$ 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
Run Code Online (Sandbox Code Playgroud)

sed命令适用于除您标记为“不同”的组之外的所有命令:

sed 's/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'
Run Code Online (Sandbox Code Playgroud)

我相信它的工作原理类似于 Ignacio 的 Python 脚本。