Maneira certa de obter a lista de pacotes instalados que correspondem a um padrão?

4

Estou no sistema executando uma distribuição (bastante recente) baseada no Debian.

Gostaria de gerar uma lista simples de todos os pacotes instalados que correspondam a um determinado padrão. Eu posso fazer isso correndo, digamos,

apt list --installed "linux-image-*" | cut -d/ -f1

mas recebo linhas que não me interessam, por exemplo:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...

Então talvez seja melhor não usar apt . Eu posso rodar o dpkg-query assim:

dpkg-query --showformat='${Package}\n' --show "linux-image*"

mas isso não está limitado a pacotes instalados. Eu poderia usar

dpkg-query --list "linux-image-*" | grep "ii"

mas eu preciso fazer um monte de processamento de texto, e quem pode confiar nesses espaços, certo?

Assim, a linha inferior: qual é o caminho correto para obter a lista de pacotes instalados que correspondem a um padrão?

Nota :

  • Pontos de bônus se puder ser um regexp adequado, em vez de apenas um glob de concha.
  • Ter que analisar o texto parece uma solução menos do que ideal; se é isso que você sugere, por favor, argumente por que não há uma maneira melhor.
por einpoklum 17.12.2017 / 22:27

3 respostas

6

aptitude suporta a pesquisa entre todos os pacotes conhecidos pelas ferramentas de gerenciamento de pacotes, instalados ou não, usando expressões regulares, sem saída irrelevante, e pode ser informado sobre como formatar sua saída:

aptitude search "linux-image-.*"

Para listar apenas os pacotes instalados:

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

Para listar apenas o pacote instalado nomes que correspondam à expressão regular:

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

A documentação cobre os padrões de pesquisa disponíveis e especificadores de formato de saída em detalhes. Você também encontrará exemplos neste site, por exemplo, existe uma maneira de usar regexp com aptidão? < href="https://unix.stackexchange.com/q/335035/86440"> regexp com o aptitude parte 2 e Linux - exibir ou atualizar atualizações de segurança usando apenas o apt .

    
por 17.12.2017 / 22:44
2

Aqui está uma boa maneira de obter a lista de pacotes instalados em um sistema baseado no Debian:

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

As linhas de saída de dpkg -l podem ser confiáveis para serem sãs. O padrão ^ii corresponderá às linhas de pacotes instalados, e o Awk simples extrairá a segunda coluna, os nomes dos pacotes (os mesmos nomes usados nos comandos apt-get install ). Nomes de pacotes não podem conter espaços em branco, então isso novamente é uma operação segura.

    
por 17.12.2017 / 22:32
0
$ 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

Falando sobre o regex:

$ 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

Você também pode usar a opção dpkg-query with -f (--showformat), que quando invocada sem qualquer nome de pacote, por padrão, apenas os pacotes instalados são listados.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show
    
por 17.12.2017 / 22:38