Das Ausgabeformat des Befehls rpm -qa
sieht 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 -qa
Liste, 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 sed
Befehl 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 --queryformat
nicht 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 -qa
Liste zur späteren Verarbeitung im CSV- oder tabulatorgetrennten Format ausgeben.