Saída de rpm -qa, como extrair apenas o nome do pacote?

4

O formato de saída do comando rpm -qa é semelhante ao seguinte:

abrt-1.1.14-1.fc14.x86_64
abrt-addon-ccpp-1.1.14-1.fc14.x86_64
abrt-addon-kerneloops-1.1.14-1.fc14.x86_64
abrt-addon-python-1.1.14-1.fc14.x86_64
abrt-desktop-1.1.14-1.fc14.x86_64
abrt-gui-1.1.14-1.fc14.x86_64
abrt-libs-1.1.14-1.fc14.x86_64
abrt-plugin-bugzilla-1.1.14-1.fc14.x86_64
abrt-plugin-logger-1.1.14-1.fc14.x86_64
abrt-plugin-runapp-1.1.14-1.fc14.x86_64

Alguém pode me dizer como remover de forma confiável a versão, o release e a parte do arco para que eu termine com

abrt
abrt-addon-ccpp
abrt-addon-kerneloops
abrt-addon-python
abrt-desktop
abrt-gui
abrt-libs
abrt-plugin-bugzilla
abrt-plugin-logger
abrt-plugin-runapp

Eu prefiro evitar tentar construir uma expressão regular para sed, porque espero que seja complicado para suportar nomes como super-3d-editor-0.1-1.fc14.x86_64 ou similar. Tenho certeza que não sou a primeira pessoa a querer tal filtragem, por isso peço aqui para verificar se já existe alguma solução.

Atualização: A nota "ou similar" acima implica algum conhecimento sobre o pacote rpm nomes parece. A maioria deles é "bonita" como os apresentados acima, mas também existem entradas com esquemas de numeração mais diversificados:

fxload-2002_04_11-9.fc12.x86_64
GitPython-0.2.0-0.3.beta1.fc14.noarch
ModemManager-0.4-4.git20100720.fc14.x86_64
python-peak-rules-0.5a1.dev-12.a1.dev.20100803svn2646.fc14.noarch
pytz-2010h-3.fc14.noarch

Observe também que existem pacotes em que um número de versão faz parte do nome como

java-1.5.0-gcj-1.5.0.0-34.fc14.x86_64
java-1.6.0-openjdk-1.6.0.0-49.1.9.3.fc14.x86_64
java-1.6.0-openjdk-devel-1.6.0.0-49.1.9.3.fc14.x86_64

e ainda há alguns em que o release / arch está faltando (pode ser difícil lidar com isso e posso aceitar a incapacidade de lidar com isso)

bouml-doc-4.3.2-3.noarch
fedora-release-14-1.noarch
glibc-2.12.90-21.i686
basesystem-10.0-3.noarch
ivtv-firmware-20080701-20.noarch
gpg-pubkey-97a1071f-4c49d6fe

É por isso que pedi uma maneira confiável de fazer isso; Eu sabia que criar um regex sed aproximado seria possível, mas estava fadado a falhar em lidar com muitas linhas.

(Eu sei que é possível formatar a saída do rpm com --queryformat, no entanto, isso não será de grande ajuda para mim, pois quero comparar quais pacotes eu instalei hoje comparando com uma listagem rpm -qa que foi gerado há um ano.)

    
por hlovdal 17.12.2010 / 22:47

6 respostas

5

Desde que você já é pooched, você precisa esculpir a porcaria do ano passado. Se for consistente o suficiente para estar sempre no formato de material, aqui vai:

#!/usr/bin/python

import sys

for line in sys.stdin:
  if line.startswith('gpg-pubkey-'):
    continue # We don't care about imported keys. G'bye!
  try:
    woarch = line.rsplit('.', 1)[0] # Bye, arch!
    worel = woarch.rsplit('-', 1)[0] # Bye, release!
    wover = worel.rsplit('-', 1)[0] # Bye, version!
  except Exception, e: # Well nuts...
    print '%s ** %s' % (e, line)
    continue
  print wover

Apenas redirecione a porcaria do ano passado e você terá apenas os nomes que importam.

    
por 18.12.2010 / 03:28
6

Você pode usar o parâmetro --qf queryformat do rpm. Você dá a ela uma string de formato onde você pode ter tags cercadas por %{} . Você pode ver todas as tags permitidas com rpm --querytags

Suponho que você gostaria de algo como:

rpm -qa --qf "%{NAME}\n"
    
por 18.12.2010 / 00:41
6

Isso está longe de ser perfeito, mas vale a pena tentar.

$ rpm -qa --qf "%{NAME}\n" > currentlist
$ join -t . -v 1 oldlist currentlist    # show packages in oldlist not in currentlist
$ join -t . -v 2 oldlist currentlist    # show packages in currentlist not in oldlist

Este comando sed funciona em todos os exceto para o grupo que você classificou como "diverso":

sed 's/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'

Eu acredito que ele funciona de forma semelhante ao script Python de Ignacio.

    
por 18.12.2010 / 03:37
1

O rpm é um comando muito flexível com várias opções úteis.

Por exemplo, você pode querer mostrar a data da instalação de cada pacote usando:

rpm -qa --queryformat '%{NAME}  %{INSTALLTIME:date}\n'

( --qf é a forma abreviada de --queryformat )

Veja: link

    
por 18.12.2010 / 00:53
0

Não sei por que você acha que --queryformat não vai ajudá-lo ... por que não fazer como uma das respostas anteriores sugere e usá-lo para dividir a versão e a arquitetura do nome? Dessa forma, você pode gerar a listagem rpm -qa em formato CSV ou separado por tabulações para processamento posterior.

    
por 18.12.2010 / 01:08
0

Eu gosto do acima, que é perfeito e, de longe, o mais simples, mas eu gostaria de obter uma lista e instalá-los em outra máquina, então eu faço isso:

rpm -qa --qf "%{NAME} " >installed-rpms.txt

então eu faço isso na próxima máquina:

yum -y install $(cat installed-rpms.txt)

Eu tenho que adicionar -y porque eu realmente quero fazer isso muito e tenho certeza que a lista de rpm é o que eu quero.

    
por 27.04.2017 / 01:08

Tags