TL; DR
Третя спроба насправді працює! Я залишаю перші 2 спроби, щоб інші, які в майбутньому можуть зіткнутися з цим запитаннями, сподіваються, отримають деяке розуміння того, наскільки нетривіальною проблемою є розбір інформації про версії RPM та визначення рядків, які виникли першими, другими, тощо.
Спроба №1 (ОП заявила, що не працює)
Ця команда буде сортувати вихід та подавати їх у порядку версії:
$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n
2.6.18 238.12.1.el5
2.6.18 238.19.1.el5
2.6.18 274.12.1.el5
2.6.18 308.8.2.el5
ЧОМУ НЕ РОБОТИ: Наївна людина подумає, що ви можете використовувати якийсь варіант sort
команди для виконання цього завдання, але є достатньо варіабельності та неузгодженості у форматуванні фактичної інформації про версію для заданого RPM, що це просто так " t до завдання.
Спроба №2 (ОП заявила, що не працює)
$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14
ЧОМУ НЕ РОБОТИ: Я покладав великі сподівання, що такий підхід дасть результати, яких шукав ОП, але проблема з цим, як в коментарях зазначив @Joel, полягає в тому, що --last
комутатор просто повертає результати, відсортовані за дата встановлення RPM.
Спроба №3
Цей обов’язково зробить роботу. Я знайшов набір інструментів під назвою Інструменти розвитку RPM. У цьому наборі є два інструменти, які дозволять вам визначити, чи є одна версія RPM новішою чи старшою за іншу.
Якщо RPM ще не встановлений, ви можете зробити наступне:
yum install rpmdevtools
Перший корисний засіб називається rpmdev-vercmp
. Цей інструмент може порівняти 2 назви RPM і сказати, який з них новіший. Наприклад:
$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64
0:kernel-2.6.35.14-103.fc14.x86_64 is newer
Після цього я все був готовий скласти сценарій оболонки, але потім зрозумів, людина, я лінивий, тому я ткнув ще кілька хвилин і знайшов ще один інструмент у наборі, що називається rpmdev-sort
.
Цей інструмент - платна бруд. Ви можете використовувати його наступним чином:
$ rpm -q kernel | rpmdev-sort
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64
В Інструментах розвитку RPM є багато інструментів, які, можливо, варто подивитися іншим, тому я перелічу їх тут для подальшої довідки.
$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \
| grep -E "^.* -..x..x..x " \
| awk '{print $3}' \
| sed 's#/usr/bin/##' \
| paste - - - \
| column -t
annotate-output checkbashisms licensecheck
manpage-alert rpmargs rpmdev-bumpspec
rpmdev-checksig rpmdev-cksum rpmdev-diff
rpmdev-extract rpmdev-md5 rpmdev-newinit
rpmdev-newspec rpmdev-packager rpmdev-rmdevelrpms
rpmdev-setuptree rpmdev-sha1 rpmdev-sha224
rpmdev-sha256 rpmdev-sha384 rpmdev-sha512
rpmdev-sort rpmdev-sum rpmdev-vercmp
rpmdev-wipetree rpmelfsym rpmfile
rpminfo rpmls rpmpeek
rpmsodiff rpmsoname spectool
Альтернатива №3
Альтернативу, яку використовує ОП, зазначена в коментарях, використовувати sort -V
. Це капітал -V
. Я ніколи не чув про цей перемикач. На sort
чоловіковій сторінці:
-V, --version-sort
natural sort of (version) numbers within text
Як виявляється, sort
передбачено можливість сортувати номери версій, щоб ви могли також сортувати так:
$ rpm -q kernel | sort -V
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64