如何使用apt-cache或dpkg命令仅获取已安装软件包的指定字段(如版本号)
我明白你现在的需求——就是想直接用dpkg或者apt-cache这类原生命令,只提取已安装软件包的特定字段(比如版本号),而不是输出一堆无关内容对吧?下面给你几个精准的解决方案:
一、优先用dpkg系列工具(直接查询已安装包,最准确)
dpkg本身提供了专门查询已安装包元数据的工具,完全能满足你的需求:
1. 使用dpkg-query(最推荐,支持自定义输出字段)
这是dpkg套件里专门用于查询已安装包信息的命令,支持指定输出格式,能直接返回你需要的字段内容,没有多余输出。比如要获取discord的版本号,直接运行:
dpkg-query -W -f='${Version}\n' discord
参数说明:
-W:指定查询已安装的软件包-f='${Version}\n':自定义输出格式,${Version}是版本字段的变量,\n用来换行,确保输出只有版本号一行。
如果需要其他字段,把${Version}换成对应的变量即可,比如${Package}(包名)、${Maintainer}(维护者)、${Architecture}(架构)等,这些都是dpkg内置的字段变量。
2. 用dpkg -l配合简单过滤(快速替代方案)
如果不想记dpkg-query的参数,也可以用dpkg -l结合文本过滤工具提取版本号:
dpkg -l discord | grep -E "^ii" | awk '{print $3}'
解释:dpkg -l会列出系统中所有已安装包,^ii匹配的是已安装状态的包行,然后用awk提取该行的第三列(也就是版本号)。
二、apt-cache相关方法(适合结合仓库信息查询,但需过滤已安装版本)
apt-cache主要用于查询软件仓库中的包信息,默认不会只返回已安装版本,所以需要额外过滤:
1. 用apt-cache policy提取已安装版本
apt-cache policy会显示包的安装状态和仓库中的候选版本,我们可以从中过滤出已安装的版本:
apt-cache policy discord | grep -A 1 "Installed:" | tail -n 1 | xargs
解释:grep -A 1 "Installed:"会匹配到“Installed:”那一行以及紧随其后的版本号行,tail -n1取出版本号那行,xargs用来去掉多余的空格。
2. 用apt-cache show配合过滤(注意:可能返回仓库最新版本,而非已安装版本)
如果用apt-cache show,默认会输出仓库中该包的所有版本信息,需要额外处理才能拿到已安装版本,但这个方法不如dpkg的准确,仅作参考:
apt-cache show discord | grep -E "^Version:" | head -n1
⚠️ 注意:这个命令返回的是仓库中的候选版本,不一定是你当前已安装的版本,所以更推荐用dpkg系列的方法来获取已安装版本。
针对你补充的需求(仅显示已安装版本),dpkg-query的方法是最精准的,它直接查询本地已安装包的数据库,完全不会涉及仓库中的其他版本信息。
备注:内容来源于stack exchange,提问作者Mario Palumbo

