El formato de salida del comando rpm -qa
se parece al siguiente:
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
¿Alguien puede decirme cómo eliminar de manera confiable la versión, la versión y la parte del arco para terminar con
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
Preferiría evitar intentar construir una expresión regular para sed, porque espero que sea complicado para admitir nombres como super-3d-editor-0.1-1.fc14.x86_64 o similares. Estoy seguro de que no soy la primera persona que desea este tipo de filtrado, por lo que pido aquí que verifiquemos si ya existe alguna solución.
Actualizar: La nota "o similar" anterior implica cierto conocimiento sobre cómo se ven los nombres de los paquetes rpm. La mayoría de ellos son "bonitos" como los presentados anteriormente, pero también hay entradas con esquemas de numeración más 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
También tenga en cuenta que existen paquetes donde un número de versión es parte del nombre 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 incluso hay algunos en los que falta la versión/arco (estos pueden ser difíciles de manejar y puedo aceptar que no se puedan manejar)
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 eso pedí una forma confiable de hacer esto; Sabía que sería posible crear una expresión regular sed aproximada, pero era probable que no pudiera manejar muchas líneas.
(Sé que es posible formatear la salida de rpm con --queryformat, sin embargo, eso no me será de ayuda porque quiero comparar qué paquetes he instalado hoy comparándolos con una rpm -qa
lista que se generó hace un año. )
Respuesta1
Como ya estás perdido, debes deshacerte de la basura del año pasado.Sies lo suficientemente consistente como para estar siempre en el formato original, aquí tienes:
#!/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)
Simplemente redirija la basura del año pasado y obtendrá solo los nombres que importan.
Respuesta2
Puede utilizar --qf
el parámetro queryformat de rpm. Le asignas una cadena de formato donde puedes tener etiquetas rodeadas por %{}
. Puedes ver todas las etiquetas permitidas conrpm --querytags
Supongo que querrías algo como:
rpm -qa --qf "%{NAME}\n"
Respuesta3
Esto está lejos de ser perfecto, pero vale la pena intentarlo.
$ 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 en todos excepto en el grupo que etiquetó como "diverso":
sed 's/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'
Creo que funciona de manera similar al script Python de Ignacio.
Respuesta4
No estoy seguro de por qué cree --queryformat
que no le ayudará... ¿por qué no hacer lo que sugiere una de las respuestas anteriores y utilizarla para separar la versión y la arquitectura del nombre? De esa manera, puede generar la rpm -qa
lista en formato CSV o separado por tabulaciones para su posterior procesamiento.