正确的方法来获取与模式匹配的已安装软件包的列表?


11

我正在运行(相当近期)基于Debian的发行版的系统上。

我想生成一个与特定模式匹配的所有已安装软件包的简单列表。我可以通过运行说

apt list --installed "linux-image-*" | cut -d/ -f1

但是我得到了我不关心的行,例如:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...

所以也许我最好不要使用apt。我可以像这样运行dpkg-query:

dpkg-query --showformat='${Package}\n' --show "linux-image*"

但这不仅限于已安装的软件包。我可以用

dpkg-query --list "linux-image-*" | grep "ii"

但是然后我需要做大量的文本处理,谁能相信这些空间,对吗?

因此,底线是:获取与模式匹配的已安装软件包列表的正确方法是什么?


注意事项

  • 如果它可以是一个合适的正则表达式,而不只是一个shell glob,则可以加分。
  • 不得不解析文本似乎不是一个理想的解决方案。如果这是您的建议,请说明为什么没有更好的方法。

Answers:


8

aptitude 支持使用正则表达式在包管理工具已知的所有已安装或已安装的软件包中进行搜索,而不会产生多余的输出,并且可以告诉您如何格式化其输出:

aptitude search "linux-image-.*"

要仅列出已安装的软件包:

aptitude search "linux-image-.* ~i"

要仅列出与正则表达式匹配的已安装软件包名称

aptitude search "linux-image-.* ~i" -F "%p"

该文档详细介绍了可用的搜索模式输出格式说明符。您还将在此站点上找到示例,例如,是否可以通过aptitude使用regexp?具有aptitude第2部分的regexpLinux-仅使用apt显示或升级安全更新


7
$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1{print $1}'
linux-image-3.16.0-4-amd64
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64
linux-image-4.8.0-2-amd64
linux-image-4.9.0-1-amd64
linux-image-4.9.0-2-amd64
linux-image-4.9.0-3-amd64

谈论正则表达式:

$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1 && $0~/4.1/{print $1}'
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64

您还可以使用dpkg-query-f(--showformat)选项,当调用没有任何包名,默认情况下只安装的软件包中列出。

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show

6

这是在基于Debian的系统上获取已安装软件包列表的一种好方法:

dpkg -l | grep ^ii | awk '{print $2}'

的输出线dpkg -l可以被认为是理智的。该模式^ii将与已安装软件包的行匹配,简单的Awk将提取第二列,即软件包名称(与apt-get install命令中使用的名称相同)。程序包名称不能包含空格,因此这再次是安全的操作。


当您要按版本进行grep时,此方法有效。与这些问题的答案aptitude search,并apt list在这种情况下没有。
Hi-Angel

1

为了在grep ping dpkg输出时“捕获”搜索词,需要如下封装搜索词。“ git ”用作样本搜索词:

dpkg -l |grep "^ii  git[[:space:]]"

克拉(^)II,随后(2)的空间前面加上术语搜索确保没有BEFORE它字符以外的该组合可以匹配。

[[:space:]]抵接所搜索术语排除了从仅通过匹配立即空格出现部分匹配它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.