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

Estou em um sistema executando uma distribuição baseada em Debian (bastante recente-).

Gostaria de gerar um lista de todos os pacotes instalados que correspondem a um determinado padrão. Posso fazer isso executando, digamos,

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

mas obtenho 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 eu não usar apt. Posso executar dpkg-query assim:

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

mas isso “não se limita a 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?

Então, linha de fundo: qual é o direita maneira de obter a lista de pacotes instalados que correspondem a um padrão?


Observação :

  • Pontos de bônus se puder ser uma expressão regular adequada em vez de apenas um shell glob.
  • Ter que analisar o texto parece uma solução menos do que ideal; se é isso que você sugere, argumente por que não existe uma maneira melhor.

Resposta

aptitude oferece suporte à 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 como formatar sua saída:

Para listar apenas os pacotes instalados:

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

Para listar apenas os nomes dos pacotes instalados correspondendo à 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 há uma maneira de usar regexp com aptitude? , regexp com aptitude parte 2 e Linux – exibir ou atualizar atualizações de segurança apenas usando apt .

Resposta

$ 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-query com a opção -f (–showformat), que quando invocado sem qualquer nome de pacote, por padrão, apenas pacotes instalados estão listados.

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

Comentários

  • " adicionar |awk -F'/' 'NR>1{print $1}' ao comando apt list " é a resposta mais curta possível para " nomes apt list only "

Resposta

Esta é uma boa maneira de pegue a lista de pacotes paralisados em um sistema baseado em Debian:

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

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

Comentários

  • Isso funciona quando você deseja fazer um grep por versão. As respostas com aptitude search e apt list neste caso não ' t.

Resposta

Para “interceptar” o termo pesquisado quando grep ping dpkg output, precisa incluir o termo de pesquisa da seguinte maneira. “ git ” é usado como o termo de pesquisa de espécime:

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

O carat (^) ii seguido por (2) espaços antes do termo pesquisado não garante nada ANTES que outra combinação de caracteres possa corresponder.

O [[:space:]] próximo ao termo pesquisado impede que correspondências parciais ocorram, correspondendo apenas espaços imediatamente APÓS isso.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *