Это близко:
rpm -q --whatprovides "foo = 2"
но он не принимает версию. Чтобы получить это, вернитесь на шаг назад и отформатируйте вывод от
rpm -q --whatprovides foo
вот так:
rpm -q --queryformat "%{VERSION}:%{NAME}\n" --whatprovides foo
и отфильтруйте результат с помощью grep (чтобы выбрать "2"), а затем через sed, чтобы удалить лишнюю версию, за которой следует двоеточие:
grep -E '/^2:/' | sed -e 's/^[^:]*://'
Это дает только имя пакета. На практике вам нужны версия, релиз и архитектура, чтобы установить правильную зависимость.
Для справки: 5.2.5. Определение того, какой пакет предоставляет определенную возможность (Fedora RPM Guide)
По поводу замечания ОП о том, что awk был бы проще:
awk -F: '{ if ($1 == "2") print $2}'
Я согласен (но по привычке, работая над скриптами configure, использую awk вторым после grep/sed, поскольку он немного менее переносим). Однако, если нужно проверить наличие пакетов с версиями больше или равными заданному значению, awk, безусловно, будет намного проще, например,
awk -F: '{ if ($1 >= 2) print $2}'
Это пришло мне в голову сегодня утром, когда я уже ушел. Но такой тип сравнения, вероятно, более распространен в spec-файлах, чем точные совпадения. Кроме того, цитирование "2"
может заставить awk рассматривать его как строку, а не как число. Это не будет соответствовать версии 2.0
, но если оставить его без кавычек и в виде числа, то он будет соответствовать.
@dave-thompson-085 указал, что заключение сравнения в действие является излишним. То есть, часть внутри {
и }
в предшествующем является действием, для всех строк (так как шаблон не задан). Цитирую со страницы руководства mawk:
Программа AWK - это последовательность пар {действие} шаблонов и определений пользовательских функций.
и далее
A pattern can be:
BEGIN
END
expression
expression , expression
Выражение может быть регулярным выражением, но также может быть сравнением. Он предложил следующее улучшение
awk -F: '$1>=2{print $2}'