Как получить только один символ после совпадения в строке (для определения версии RHEL от rpm)

У меня есть сценарий shell / bash с открытым исходным кодом для настройки и настройки серверов хостинга, а для установки cloudflare я вытаскиваю версию RHEL с помощью этой команды :

RHEL_VERSION=$(rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release) ); 

Проблема в том, что если есть небольшая версия, она будет возвращена вместо основной версии. С cmd выше он вернет 7.2 … проблема в том, что мне нужен только основной номер версии.

Я думаю, что я, возможно, просто использую rpm -q --whatprovides redhat-release который вернет что-то вроде cloudlinux-release-7.2-1.el7.x86_64 , а затем просто sed , awk и т. Д., Чтобы получить только el7 часть строки.

К сожалению, сейчас мой мозг просто держится, и я потратил час, пытаясь понять что-то настолько просто, что я думаю, что лучше всего просто попросить о помощи сейчас … так что, пожалуйста, кто-нибудь может помочь мне с этим 🙂

Мне нужно это, чтобы иметь возможность использовать строку при создании URL-адреса пакета:

 PACKAGE_URL="http://pkg.cloudflare.com/cloudflare-release-latest.el${RHEL_VERSION}.rpm" 

Чтобы отрезать основной компонент версии, просто выполните:

 ... | grep -Eo '^[0-9]*' 

Опция -o для этого расширенного grep печатает только согласованную часть; здесь первая цифра (ы), которой предшествует символ точки.

 $ RHEL_VERSION=7.2-1.el6 $ echo "${RHEL_VERSION%%[!0-9]*}" 7 $ echo "${RHEL_VERSION%%-*}" 7.2 $ echo "${RHEL_VERSION##*.}" el6 $ echo "${RHEL_VERSION##*[!0-9]}" 6 

У меня нет rpm под рукой в ​​этой системе, но мне удалось сделать это с помощью bash :

 PROVIDED=cloudlinux-release-7.2-1.el7.x86_64 RHEL_VERSION=`echo $PROVIDED | sed 's/^.*-release-\([0-9]\).*/\1/' echo $RHEL_VERSION 

который выводит « 7 ».

При необходимости вы можете заменить « -release- » на более подходящее регулярное выражение.

Вы можете попробовать такие вещи, как:

 echo $PROVIDED | sed -ne 's/^[^-]*-\([^-]*\)-.*$/\1/p' 

который возвращает « release » для меня [–version: sed (GNU sed) 4.2.2] .

Вы также можете проконсультироваться с этим фантастическим ответом об определении вашего имени (и версии) операционной системы. Основываясь на этом ответе, вы можете сделать что-то вроде:

 RHEL_VERSION="$(lsb_release -r | awk '{print $NF}')" 

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

Если вы уверены, что номер выпуска будет чисто цифровым (с десятичной точкой, разделяющей основные и младшие номера, вы можете сделать все это одним махом:

 RHEL_MAJOR_VERSION="$(lsb_release -r|awk '{printf "%d\n",$N}')"