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

我使用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的激增,这些字符串越来越长。 有没有更简单的方法?

 dpkg -s  | grep '^Version:' 

例如:

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

样本输出:

 Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2 
 dpkg-query --showformat='${Version}' --show python3-lxml 

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

例:

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

我认为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 

另一种通过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列表示包描述