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

나는 super-3d-editor-0.1-1.fc14.x86_64 또는 유사한 이름을 지원하기 위해 sed가 복잡할 것으로 예상하기 때문에 sed에 대한 정규식을 구성하는 것을 피하고 싶습니다. 나는 그러한 필터링을 원하는 첫 번째 사람이 아니라고 확신하므로 이미 해결책이 있는지 확인하기 위해 여기에 요청합니다.

업데이트: 위의 "또는 유사한" 참고 사항은 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 -qa(저는 --queryformat을 사용하여 rpm의 출력 형식을 지정할 수 있다는 것을 알고 있지만 1년 전에 생성된 목록 과 비교하여 오늘 설치한 패키지를 비교하고 싶기 때문에 이는 도움이 되지 않습니다 . )

답변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

rpm의 queryformat 매개변수를 사용할 수 있습니다 --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/-[^-]*-[^-]*\.[^.]*\.[^.]*$//'

나는 이것이 Ignacio의 Python 스크립트와 유사하게 작동한다고 생각합니다.

답변4

왜 도움이 되지 않을 것이라고 생각하는지 잘 모르겠습니다 --queryformat... 이전 답변 중 하나가 제안한 대로 수행하여 이름에서 버전과 아키텍처를 분리하는 데 사용하는 것은 어떻습니까? 이렇게 하면 rpm -qa나중에 처리하기 위해 목록을 CSV 또는 탭으로 구분된 형식으로 출력할 수 있습니다.

관련 정보