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
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
eapt 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.
|awk -F'/' 'NR>1{print $1}'
ao comando apt list " é a resposta mais curta possível para " nomes apt list only "