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 com segurança a versão, o lançamento 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
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 de que não sou a primeira pessoa a querer tal filtragem, por isso peço aqui para verificar se já existe alguma solução.
Atualizar: A nota "ou similar" acima implica algum conhecimento sobre a aparência dos nomes dos pacotes rpm. A maioria deles são “bonitos” como os apresentados acima, mas também existem entradas com esquemas de numeração mais diversos:
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 onde 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 há até alguns em que falta o lançamento/arquiteto (podem ser difíceis de lidar e posso aceitar a falha em lidar com eles)
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 seria possível criar um sed regex aproximado, mas ele falharia ao lidar com muitas linhas.
(Eu sei que é possível formatar a saída do rpm com --queryformat, porém isso não vai me ajudar porque quero comparar quais pacotes instalei hoje comparando com uma rpm -qa
listagem que foi gerada há um ano. )
Responder1
Já que você já está maluco, precisa eliminar a porcaria do ano passado.Seé consistente o suficiente para estar sempre no formato de estoque, aqui está:
#!/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 as e: # Well nuts...
print ('%s ** %s') % (e, line)
continue
print (wover)
Basta redirecionar a porcaria do ano passado para isso e você obterá apenas os nomes que importam.
Responder2
Você pode usar o parâmetro queryformat do rpm --qf
. Você fornece uma string de formato onde pode ter tags cercadas por %{}
. Você pode ver todas as tags permitidas comrpm --querytags
Eu estou supondo que você gostaria de algo como:
rpm -qa --qf "%{NAME}\n"
Responder3
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 sed
comando funciona em todos, exceto no grupo que você rotulou de "diverso":
sed 's/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'
Acredito que funciona de forma semelhante ao script Python do Ignacio.
Responder4
Não sei por que você acha --queryformat
que não vai te ajudar... por que não fazer como sugere uma das respostas anteriores e usá-lo para separar a versão e a arquitetura do nome? Dessa forma, você pode gerar a rpm -qa
listagem em CSV ou formato separado por tabulações para processamento posterior.