Ausgabe von rpm -qa: Wie extrahiere ich nur den Namen des Pakets?

Ausgabe von rpm -qa: Wie extrahiere ich nur den Namen des Pakets?

Das Ausgabeformat des Befehls rpm -qasieht wie folgt aus:

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

Kann mir jemand sagen, wie ich Version, Release und Arch-Teil zuverlässig entferne, so dass ich am Ende

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

Ich würde lieber vermeiden, einen regulären Ausdruck für sed zu konstruieren, da ich davon ausgehe, dass es kompliziert wäre, Namen wie super-3d-editor-0.1-1.fc14.x86_64 oder ähnliches zu unterstützen. Ich bin sicher, dass ich nicht die erste Person bin, die eine solche Filterung wünscht, deshalb frage ich hier, ob es bereits eine Lösung gibt.

Aktualisieren: Der Hinweis „oder ähnlich“ oben setzt ein gewisses Wissen darüber voraus, wie RPM-Paketnamen aussehen. Die meisten von ihnen sehen „gut aus“, wie die oben gezeigten, aber es gibt auch Einträge mit unterschiedlicheren Nummerierungsschemata:

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

Beachten Sie auch, dass es Pakete gibt, bei denen eine Versionsnummer Teil des Namens ist, wie

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

und es gibt sogar ein paar, bei denen die Veröffentlichung/Architektur fehlt (das kann schwierig zu handhaben sein, und ich kann es akzeptieren, wenn das nicht gelingt)

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

Aus diesem Grund habe ich nach einer zuverlässigen Methode hierfür gefragt. Mir war klar, dass die Erstellung eines ungefähren Sed-Regex möglich wäre, dieser jedoch bei der Verarbeitung vieler Zeilen zwangsläufig fehlschlagen würde.


(Ich weiß, dass es möglich ist, die Ausgabe von rpm mit --queryformat zu formatieren, das hilft mir jedoch nicht weiter, da ich anhand einer rpm -qaListe, die vor einem Jahr erstellt wurde, vergleichen möchte, welche Pakete ich heute installiert habe.)

Antwort1

Da du schon ein Schwein bist, musst du den Mist vom letzten Jahr abschneiden.Wennes ist konsistent genug, um immer im Standardformat zu sein, hier ist es:

#!/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)

Leiten Sie einfach den Mist vom letzten Jahr dorthin um, und Sie erhalten nur die Namen, die wichtig sind.

Antwort2

Sie können den Parameter queryformat von rpm verwenden --qf. Sie geben ihm eine Formatzeichenfolge, in der Sie Tags mit %{}. einschließen können. Sie können alle zulässigen Tags mitrpm --querytags

Ich vermute, Sie möchten so etwas:

rpm -qa --qf "%{NAME}\n"

Antwort3

Das ist zwar bei weitem nicht perfekt, aber einen Versuch ist es wert.

$ 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

Dieser sedBefehl funktioniert bei allen außer der Gruppe, die Sie als „divers“ gekennzeichnet haben:

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

Ich glaube, es funktioniert ähnlich wie Ignacios Python-Skript.

Antwort4

Ich bin mir nicht sicher, warum Ihnen das Ihrer Meinung nach --queryformatnicht weiterhilft ... warum machen Sie es nicht wie in einer der vorherigen Antworten vorgeschlagen und trennen damit die Version und Architektur vom Namen? Auf diese Weise können Sie die rpm -qaListe zur späteren Verarbeitung im CSV- oder tabulatorgetrennten Format ausgeben.

verwandte Informationen