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


11

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

Eu gostaria de gerar uma lista simples de todos os pacotes instalados que correspondem a um determinado padrão. Eu posso fazer isso, executando, digamos,

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

mas recebo linhas das quais não me importo, por exemplo:

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

Listing...

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

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

mas isso não se limita aos pacotes instalados. eu poderia usar

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

mas então eu precisaria fazer um monte de processamento de texto, e quem pode confiar nesses espaços, certo?

Portanto, qual é o caminho certo para obter a lista de pacotes instalados que correspondem a um padrão?


Nota :

  • Pontos de bônus se puder ser uma regexp adequada, em vez de apenas uma bola de bala.
  • Ter que analisar o texto parece uma solução abaixo do ideal; se é isso que você sugere, discuta por que não existe uma maneira melhor.

Respostas:


8

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 estranha e pode ser informado sobre como formatar sua saída:

aptitude search "linux-image-.*"

Para listar apenas pacotes instalados:

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

Para listar apenas nomes de pacotes instalados que correspondem à expressão regular:

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

A documentação cobre os padrões de pesquisa disponíveis e os especificadores de formato de saída em detalhes. Você também encontrará exemplos neste site. Por exemplo, existe uma maneira de usar o regexp com o aptitude? , regexp com o aptitude parte 2 e Linux - exiba ou atualize as atualizações de segurança apenas usando o apt .


6

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

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

As linhas de saída de dpkg -lpodem ser confiáveis ​​para serem saudáveis. O padrão ^iicorresponderá às linhas dos pacotes instalados e o Awk simples extrairá a segunda coluna, os nomes dos pacotes (os mesmos nomes usados ​​nos apt-get installcomandos). Os nomes dos pacotes não podem conter espaços em branco; portanto, novamente é uma operação segura.


Isso funciona quando você deseja grep por versão. As respostas com aptitude searche apt listneste caso não.
Hi-Angel

6
$ 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 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 dpkg-querycom a -fopção (--showformat), que quando chamada sem nenhum nome de pacote, por padrão, apenas os pacotes instalados são listados.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show

1

Para "interceptar" o termo pesquisado quando grep ping dpkg output, é necessário incluir o termo de pesquisa da seguinte maneira. " git " é usado como o termo de pesquisa de amostra:

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

O quilate (^) ii seguido por (2) espaços que precedem o termo pesquisado não garante nada ANTES dele, exceto que a combinação de caracteres pode corresponder.

A [[:space:]]limitação do termo pesquisado impede que correspondências parciais ocorram apenas por espaços correspondentes imediatamente após ele.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.