$ lsb_release -c
Codename: trusty
$ cat /etc/issue
Ubuntu 14.04 LTS \n \l
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
Вывод вышеприведенных команд показывает только частичное кодовое имя (т. Е. trusty
). Как получить полное кодовое имя ( trusty tahr ) моей установленной системы Ubuntu?
Используя никакие внешние инструменты:
Вы можете всего источник (исходная команда является точкой .
), /etc/os-release
, и у Вас будет доступ ко всем переменным определенным там:
$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr
<час> Редактирование. , Если Вы хотите удалить 14.04,
часть (как спрошено terdon), Вы могли:
$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr
Примечание, что это немного неуклюже, с тех пор на других дистрибутивах, VERSION
поле, может иметь другой формат. Например, на моем debian,
$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
(wheezy)
Затем Вы могли вообразить что-то вроде этого (в сценарии):
#!/bin/bash
if [[ -r /etc/os-release ]]; then
. /etc/os-release
if [[ $ID = ubuntu ]]; then
read _ UBUNTU_VERSION_NAME <<< "$VERSION"
echo "Running Ubuntu $UBUNTU_VERSION_NAME"
else
echo "Not running an Ubuntu distribution. ID=$ID, VERSION=$VERSION"
fi
else
echo "Not running a distribution with /etc/os-release available"
fi
Мой вариант на том, что уже предложено:
. /etc/os-release; echo ${VERSION/*, /}
самое короткое, отвечают Bashiest до настоящего времени.
, Если Вы не хотите загрузиться /etc/os-release
содержание в Вашу текущую среду, можно фальсифицировать удар в размышление, что это загружает сценарий довольно легко:
bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr
lsb_release -rs
-> Печатает Вашу установленную версию Ubuntu.
grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info
-> Захватывают все строки, который содержит Вашу версию выпуска, в моем случае это 14.04.
grep -m 1 "Description: Ubuntu "
-> Снова захватывает только подобранную первую строку (из-за -m
флаг), который содержит строку Description: Ubuntu
.
cut -d "'" -f2
-> печатает поле номер 2 согласно одинарной кавычке разделителя '
$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr
Объявление и присвоение Переменной в awk сделаны через -v
параметр. Так значение lsb_release -rs
команда присвоена переменной var
какой внутренний изгиб помогает распечатать поле 4, поле 5 от строк содержат строку 14.04
и существует если его найденный тот. Наконец cut
команда помогает удалить одинарные кавычки.
Команда, которую Вы ищете:
grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release
Это очень ужасно и не оптимизированное. Я уверен, что должен быть более легкий метод, и это имеет некоторые проблемы.
Вот еще некоторые варианты. Они все анализируют /etc/os-release
файл, который, на моих 13.10, похож на это:
NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
Все решения ниже проанализируют вторую строку для создания Saucy Salamander
.
grep
grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
-o
означает "печать только часть соответствия строки" и -P
включает Perl Совместимые Регулярные выражения. Это позволяет нам использовать \K
который отбрасывает то, что было подобрано до той точки, которая объединилась с -o
означает "печать только что соответствия после \K
. Так, фактическое используемое регулярное выражение распознает последние два слова строки, которая содержит VERSION=
.
awk
awk -F'[" ]' '/VERSION=/{print $3,$4}' /etc/os-release
Установка разделителя полей к "
и space
средства, что 3-е и 4rth поля строки, содержащей VERSION=
строка, которая мы после.
sed
sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
-n
переключатель подавляет нормальный вывод, никакие строки не будут распечатаны. -r
позволяет расширенные регулярные выражения. Затем на строках то соответствие VERSION=
, мы удалим все кроме последних двух слов. p
в конце означает печать.
perl
perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
-n
означает, 'обрабатывают каждую входную строку со сценарием, данным -e
". -l
добавляет символ новой строки к каждому вызову печати (и некоторый другой материал, который не является relevevant здесь). Регулярное выражение распознает последние два слова (\b
граница слова), и печатает их, если строка содержит VERSION=
.
coreutils
grep VERSION= /etc/os-release | cut -d ' ' -f 2- | tr -d '"'
Здесь, мы просто grep
соответствующая строка и использование cut
установка разделителя полей к space
(-d ' '
) и печать всего от 2-го поля в конец строки. tr -d
команда удалит "
от конца.
Чистая оболочка (бесстыдно крадущий умный @gniourf_gniourf source
идея):
. /etc/os-release && echo ${VERSION//[0-9,. ]/ }
.
получает файл, который делает переменные доступными для оболочки, и я использую возможности обработки строк удара удалить номера версий.
Используя regex Вы могли сделать это:
grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"
Это ищет строку с VERSION
в файле /etc/os-release
. Затем это находит 2 последовательных слова разделенными пространством (Perl regex). Флаг-o сохраняет только, что соответствует поиску.
Необходимо использовать [a-zA-Z]
вместо 'w' для предотвращения включая цифры.
Ответ актуален как минимум для ubuntu 16.04 и выше:
lsb_release -cs
Если по какой-то причине lsb_release
недоступен
cat /etc/os-release | grep UBUNTU_CODENAME | cut -d = -f 2