如何通过dpkg查找已安装软件包的版本号?


83

我使用dpkg -l命令来查找已安装的软件包的版本。例如:

dpkg -l network-manager

返回包装上的信息:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                      Version                   Description
+++-=========================-=========================-==================================================================
ii  network-manager           0.8.3~git.20101118t223039 network management framework daemon

如您所见,它返回0.8.3~git.20101118t223039错误,因为它会截断版本(出于这个问题的目的,我选择了一个较长的版本)。我过去解决此问题的方法是传递一个愚蠢的COLUMNS参数以使其扩展:

COLUMNS=200 dpkg -l network-manager

这给了我完整的版本号,但也有很多垃圾:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                         Version                                      Description
+++-============================================-============================================-========================================================================================================
ii  network-manager                              0.8.3~git.20101118t223039.d60a988-0ubuntu1   network management framework daemon

现在,我可以看到完整的版本号,即0.8.3~git.20101118t223039.d60a988-0ubuntu1

我感到这不是查找已安装软件包的版本号的正确方法。过去这从来不是真正的问题,但是随着版本中“ ubuntu”的加入和PPA的增加,这些字符串变得越来越长。有更容易的方法吗?

Answers:


82
dpkg -s <packagename> | grep '^Version:'

例如:

dpkg -s network-manager | grep '^Version:'

样本输出:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2

dpkg --info package.deb作品,尽管-s没有
扭曲梨

2
@Twisted Pear- dpkg --info package.deb对软件包文件进行dpkg -s <packagename>操作,对软件包名称进行操作-无需文件
通道

37
dpkg-query --showformat='${Version}' --show python3-lxml

2
查询多个软件包时,我建议:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner 2015年

6
我喜欢这个版本,因为它很精确(不需要grep或cut)。
guettli

1
几乎可以肯定要打印换行符,否则就是类似“ printf”的行为。例如,dpkg-query --showformat='${Version}\n' --show python3-lxml
克里斯·兰姆

25

它不是使用dpkg命令,而是apt-show-versions 安装女妖

例:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2

15

我认为aneeshep是最好的答案,因为您的问题使用dpkg指定。但是出于完整性考虑,这是另一种方式:

apt-cache policy network-manager 
network-manager:
  Installed: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Candidate: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Version table:
 *** 0.8.1+git.20100810t184654.ab580f4-0ubuntu2 0
        500 http://us.archive.ubuntu.com/ubuntu/ maverick/main i386 Packages
        100 /var/lib/dpkg/status

或仅针对版本号:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2

1
的输出apt-cache取决于当前的语言环境。例如在德国,您需要grep 'Installiert:'。为了弥补这一点,C.UTF-8在编写脚本时始终使用语言环境。无论是用LC_ALL=C.UTF-8; export LC_ALL在脚本的开始或为个案逐案是这样的:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
蒂诺

5

通过dpkg以下方法找到已安装软件包版本的另一种方法,

dpkg -l | awk '$2=="package-name" { print $3 }'  

例:

$ dpkg -l | awk '$2=="network-manager" { print $3 }'
0.9.8.0-0ubuntu22

说明:

dpkg -l该命令列出了所有已安装的软件包。此标准输出作为awk命令的输入。如果找到,则awk在标准输入(第2列)中搜索相应的包名称,然后抓住相应的行。最后输出实际上代表软件包版本的(第3列)的值。

$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description

根据以上内容,第2列代表软件包名称,第3列代表软件包版本,第4列代表体系结构,第5列代表软件包描述


为什么需要首先使用列出所有软件包dpkg,然后再用awk对其进行过滤?您也可以请求单个软件包的清单:dpkg -l <package-name>
gertvdijk '18
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.