如何列出所有已安装的软件包及其特定版本号?

我想列出系统上所有已安装的软件包,并显示具体的版本号。我查看了dpkg --get-selections如何列出所有已安装的软件包),但它没有显示我所需的信息。例如:
$ dpkg --get-selections apache2
apache2                                         install

显示apache2已安装,但未显示版本。我最近执行了apt-get upgrade命令,所以应该安装了apache2.2.22-1版本(http://packages.ubuntu.com/precise-updates/apache2.2-common),但如何显示出来呢?
谢谢!
2个回答

使用dpkg -l代替。

例子:

dpkg -l | grep '^ii' | grep skype

```

输出如下:

alaa@aa-lu:~$ dpkg -l | grep '^ii' | grep skype
ii    skype      4.2.0.11-0ubuntu0.12.04.2       i386     用于Skype语音通信的客户端...

如果您只想提取名称和版本,可以这样做:

```
dpkg -l | grep '^ii' | grep skype | awk '{print $2 "\t" $3}'

只打印上述输出的第二列和第三列,就像这样:
alaa@aa-lu:~$ dpkg -l | grep '^ii' | grep skype | awk '{print $2 "\t" $3}'
skype   4.2.0.11-0ubuntu0.12.04.2
当然,如果你想列出所有已安装的软件包及其版本,而不仅仅是Skype,那么只需删除grep skype部分,使命令变成这样:
dpkg -l | grep '^ii' | awk '{print $2 "\t" $3}'

我注意到当版本号超过21个字符时,dpkg -l 会截断版本号,而所有软件包的版本号都是22个字符长。:( - ThorSummoner

使用
dpkg-query --show apache2

获取软件包apache2的版本号。
dpkg-query --show 

获取所有已安装软件包的版本号。

1你的解决方案给了我比 dpkg -l | grep '^ii' | awk '{print $2 "\t" $3}' 多约 20% 的软件包。你知道有什么区别吗? - Thomas Jensen
6@Thomas Jensen:谢谢你发现了这个问题。实际上,dpkg-query --show并不显示已安装的软件包,而是显示未被卸载的软件包。也就是说,它会显示一些只安装了一半或者还有配置文件剩余的软件包。 - Florian Diesch