Вывод от об/мин - обеспечение качества, как извлечь только название пакета?

Выходной формат от команды 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 regex будет возможен, но он был обязан не удаться обработать много строк.


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

4
задан 17.06.2015, 18:47

5 ответов

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

#!/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, e: # Well nuts...
    print '%s ** %s' % (e, line)
    continue
  print wover

Просто перенаправьте прошлогоднее дерьмо в него, и Вы получите просто имена тот вопрос.

6
ответ дан 07.12.2019, 19:06

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

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

rpm -qa --qf "%{NAME}\n"
6
ответ дан 07.12.2019, 19:06

Это совсем не прекрасно, но это стоит попытки.

$ 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 Ignacio.

6
ответ дан 07.12.2019, 19:06

об/мин является очень гибкой командой с набором полезных опций.

Например, можно хотеть показать дату установки каждого использования пакета:

rpm -qa --queryformat '%{NAME}  %{INSTALLTIME:date}\n'

(--qf краткая форма --queryformat)

Взгляните на:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

1
ответ дан 07.12.2019, 19:06

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

0
ответ дан 07.12.2019, 19:06

Теги

Похожие вопросы