Salida de rpm -qa, ¿cómo extraer solo el nombre del paquete?

Salida de rpm -qa, ¿cómo extraer solo el nombre del paquete?

El formato de salida del comando rpm -qase 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 -qalista 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 --qfel 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 sedcomando 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 --queryformatque 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 -qalista en formato CSV o separado por tabulaciones para su posterior procesamiento.

información relacionada