![获取与模式匹配的已安装软件包列表的正确方法?](https://linux22.com/image/123907/%E8%8E%B7%E5%8F%96%E4%B8%8E%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E5%B7%B2%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%88%97%E8%A1%A8%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我正在运行一个(相当新的)基于 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,那就加分了。
- 必须解析文本似乎是一个不太理想的解决方案;如果这就是您的建议,请说明为什么没有更好的方法。
答案1
$ 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
答案2
aptitude
支持使用正则表达式在包管理工具已知的所有包(已安装或其他方式)中进行搜索,没有无关的输出,并且可以被告知如何格式化其输出:
aptitude search "linux-image-.*"
仅列出已安装的软件包:
aptitude search "linux-image-.* ~i"
仅列出已安装的包名字匹配正则表达式:
aptitude search "linux-image-.* ~i" -F "%p"
该文档涵盖可用的搜索模式和输出格式说明符详细。您还可以在此网站上找到示例,例如有没有办法将 regexp 与 aptitude 一起使用?,带有 aptitude 的正则表达式第 2 部分, 和Linux - 仅使用 apt 显示或升级安全更新。
答案3
这是获取基于 Debian 的系统上已安装软件包列表的一种好方法:
dpkg -l | grep ^ii | awk '{print $2}'
可以相信的输出线dpkg -l
是正常的。该模式^ii
将匹配已安装软件包的行,简单的 Awk 将提取第二列,即软件包名称(与apt-get install
命令中使用的名称相同)。包名称不能包含空格,因此这又是一个安全的操作。
答案4
为了在搜索词时“捕获”grep平包装袋输出,需要将搜索词括起来,如下所示。 ”git" 用作样本搜索词:
dpkg -l |grep "^ii git[[:space:]]"
这克拉(^)二、后跟 (2) 个空格,在搜索词前面添加任何内容前它可以匹配除该字符组合之外的其他字符。
这[[:space:]]
搜索项可通过仅立即匹配空格来防止部分匹配发生后它。