Правильный способ получить список установленных пакетов, соответствующих шаблону?

11

Я работаю в системе (довольно недавно) на основе 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"

но тогда я должен был бы выполнить кучу обработки текста, и кто может доверять этим пробелам, верно?

Итак, суть: как правильно получить список установленных пакетов, соответствующих шаблону?


Примечание :

  • Бонусные баллы, если это может быть правильное регулярное выражение, а не просто оболочка.
  • Необходимость разбора текста кажется менее чем идеальным решением; если это то, что вы предлагаете, пожалуйста, спорьте, почему нет лучшего способа.
einpoklum
источник

Ответы:

8

aptitude поддерживает поиск среди всех пакетов, известных инструментам управления пакетами, установленным или иным образом, с использованием регулярных выражений, без лишних выводов, и может сказать, как форматировать вывод:

aptitude search "linux-image-.*"

Для просмотра списка только установленных пакетов:

aptitude search "linux-image-.* ~i"

Чтобы вывести список только установленных имен пакетов, соответствующих регулярному выражению:

aptitude search "linux-image-.* ~i" -F "%p"

Документация подробно описывает доступные шаблоны поиска и спецификаторы выходного формата . Вы также найдете примеры на этом сайте, например, есть ли способ использовать регулярное выражение с aptitude? , regexp с aptitude part 2 и Linux - отображать или обновлять обновления безопасности только с помощью apt .

Стивен Китт
источник
7
$ 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
Георгий Васильев
источник
6

Вот один хороший способ получить список установленных пакетов в системе на основе Debian:

dpkg -l | grep ^ii | awk '{print $2}'

Выходные строки dpkg -lможно доверять как нормальные. Шаблон ^iiбудет соответствовать строкам установленных пакетов, и простой Awk извлечет второй столбец, имена пакетов (те же имена, которые используются в apt-get installкомандах). Имена пакетов не могут содержать пробелы, поэтому это снова безопасная операция.

Янош
источник
Это работает, когда вы хотите grep по версии. Ответы с aptitude searchи apt listв этом случае нет.
Привет-ангел
1

Чтобы «перехватить» искомый термин при выводе команды grep ping dpkg , необходимо заключить поисковый термин следующим образом. « git » используется в качестве условия поиска образца:

dpkg -l |grep "^ii  git[[:space:]]"

Караты (^) II с последующим (2) пространствами Предварения искомого термина не гарантирует ничего ПРЕЖДЕ это кроме того , что комбинация символов может соответствовать.

[[:space:]]Примыкающий искомый термин , исключающие частичные совпадения от происходить лишь соответствующие пространства сразу ПОСЛЕ него.

F1Linux
источник