使用分隔符格式化 rpm 查询输出

Formatting a rpm query output with a separator

我正在尝试获取我系统上安装的所有软件包的列表。为此,我从 Python 脚本中调用 'rpm -qai',在该脚本中进一步对输出进行 t运行sformations。

我有点 运行 进入问题,因为上面查询的输出没有分开不同的包。这看起来像这样:

$ rpm -qai
Name     : PackageName
Version  : 1.0
...
LastEntry: Something
Name     : NextPackageName
Version  : 1.1
...

我想要的是

Name     : PackageName
Version  : 1.0
...
LastEntry: Something
//empty line or some other kind of separator
Name     : NextPackageName
Version  : 1.1
...

因为我的脚本逐行读取所有内容并将这些行保存在字典中。我现在的解决方法检查当前行是否以 'Name' 开头,如果是,则继续将字典附加到列表并清除字典;第一行跳过此步骤。

这个解决方案非常难看。不幸的是,固定数量的行不起作用,因为并非所有包都提供相同数量的信息。

我也想到了运行'rpm -qai'先,从中获取所有包名的列表,然后在调用'rpm -qi current_item'的同时遍历列表。然后可以获取每个查询的输出。但由于这需要运行两次,我认为这是不必要的额外工作。

那么,RPM(或其他一些工具)是否提供了允许所需输出的功能?

"proper" RPMDB 接口有 python 绑定,而不是解析“rpm”输出。将其视为 git 的瓷器与管道。其实yum就是全部python(我上次查的)。我认为从长远来看,这对您来说会更好 运行。

This documentation 可能是一个好的开始。

您可以使用带有格式字符串的 rpm --qf|--queryformat 标志来设置输出格式。

例如,您可以使用 rpm -qa --qf "%{NAME} %{VERSION}\n" 来获取您感兴趣的关于每个包的字段,如您所愿。

或者,根据您的情况,您可以使用类似 rpm -qai --qf "\n####\n" 的内容。您将获得有关每个包的所有字段,但您设置的分隔符将在它们之间。请注意,描述字段可能包含多行文本,因此使用 \n 作为分隔符可能是错误的。

您可以使用 man rpm 阅读更多详细信息。