Вывод rpm -qa, как извлечь только имя пакета?

Вывод rpm -qa, как извлечь только имя пакета?

Формат вывода команды rpm -qaвыглядит следующим образом:

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

Может ли кто-нибудь подсказать мне, как надежно удалить версию, выпуск и часть архитектуры, чтобы в итоге у меня получилось

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

Я бы предпочел не пытаться строить регулярное выражение для sed, потому что я ожидаю, что это будет сложно для поддержки имен вроде super-3d-editor-0.1-1.fc14.x86_64 или подобных. Я уверен, что я не первый, кто хочет такую ​​фильтрацию, поэтому я спрашиваю здесь, чтобы проверить, нет ли уже какого-то решения.

Обновлять: Примечание "или похожее" выше подразумевает некоторые знания о том, как выглядят имена пакетов rpm. Большинство из них "красиво выглядят", как представленные выше, но есть также записи с более разнообразными схемами нумерации:

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

Также обратите внимание, что существуют пакеты, в названии которых номер версии является частью имени, например:

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

и есть даже несколько, где отсутствует релиз/архитектура (с этим может быть трудно справиться, и я могу принять неудачу в этом)

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

Вот почему я просил надежный способ сделать это; я знал, что создание приблизительного регулярного выражения sed было бы возможно, но оно наверняка не справилось бы со многими строками.


(Я знаю, что можно отформатировать вывод из rpm с помощью --queryformat, однако мне это не поможет, поскольку я хочу сравнить, какие пакеты я установил сегодня, сравнив их со rpm -qaсписком, который был сгенерирован год назад.)

решение1

Поскольку ты уже обласкан, тебе нужно избавиться от прошлогоднего дерьма.Еслион достаточно последователен, чтобы всегда соответствовать стандартному формату, вот:

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

Просто перенаправьте туда прошлогодний хлам, и вы получите только те имена, которые имеют значение.

решение2

Вы можете использовать параметр queryformat в rpm --qf. Вы указываете ему строку формата, в которой теги могут быть окружены %{}. Вы можете увидеть все разрешенные теги с помощьюrpm --querytags

Я предполагаю, что вы хотели бы что-то вроде:

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

решение3

Это далеко не идеально, но попробовать стоит.

$ 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

Эта sedкоманда применима ко всем, кроме группы, которую вы обозначили как «разнообразная»:

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

Я полагаю, что он работает аналогично скрипту Игнасио на Python.

решение4

Не уверен, почему вы думаете, что --queryformatэто вам не поможет... почему бы не сделать так, как предлагает один из предыдущих ответов, и не использовать его для разделения версии и архитектуры из имени? Таким образом, вы можете вывести список rpm -qaв формате CSV или в формате с разделением табуляцией для последующей обработки.

Связанный контент