如何获得Ubuntu发行版的完整代码名?


33
$ 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)。如何获得已安装的Ubuntu系统的完整代号(trusty tahr)?


1
似乎有一个趋同的过程来采购文件/etc/os-release。也许您应该指定“我如何获得已安装的Ubuntu系统的完整代码名(可信任的密码)”的含义?。您是否只想在终端上回显它,还是需要将其分配给变量?这将在某些非{Ubuntu,Debian}系统上使用吗?
gniourf_gniourf 2014年

Answers:


43

不使用外部工具:

您可以只使用source(源命令是点.),/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

1
(echo 内置的),但是可以,如何. /etc/os-release && echo ${VERSION//[0-9,. ]/ }呢?
terdon

1
@terdon有不止一种给猫皮的方法;D
gniourf_gniourf 2014年

这里的所有评论怎么了?
gniourf_gniourf 2014年

2
有很多,您的特别好!可以删除与实际答案无关的注释,而不会发出警告。
terdon

8

我已经提供的变体:

. /etc/os-release; echo ${VERSION/*, /}

迄今为止最短,最差的答案。

如果您不希望将/etc/os-release的内容加载到当前环境中,则可以假冒bash认为它相当容易地加载脚本:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')

3
迄今为止,您敢说比什尔什么都比不上吗?还有其他完整的bash答案:D
gniourf_gniourf 2014年

为什么要下票?这是一个很好的答案(尽管在概念上与之前没有其他区别)。
gniourf_gniourf 2014年

2
嘿,巧妙地使用进程替换+1。
terdon

正如人们对大师@terdon所期望的那样:)
Rinzwind 2014年

1
一个简单的subshel​​l也可以完成此工作:( . /etc/os-release && echo ${VERSION/*, /} )
gniourf_gniourf 2014年

5

Grep:

$ 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:

$ 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变量通过完成-vparameter.So的值lsb_release -rs 命令被分配给变量var这inturn有助于从行打印字段4,区域5包含字符串14.04和存在如果发现了一个one.Finally的cut命令有助于删除单引号。


4

您要查找的命令是:

grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release

非常丑陋,并且没有优化。我敢肯定应该有一个更简单的方法,这会有一些问题。


1
. /etc/os-release 
echo $VERSION

3
您仍然需要删除数字,请参见下面使用完全相同的方法的@gniourf_gniourf的答案。
terdon

1

这里有更多选择。他们都解析了/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

  1. grep

    grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
    

    -o意思是“仅打印该行的匹配的部分”和-P使Perl兼容的正则表达式。这样,我们就可以使用\K,舍弃到该点为止匹配的所有内容,并结合使用-o“仅在。之后打印匹配的内容\K。因此,使用的实际正则表达式将匹配包含的行的最后两个单词VERSION=

  2. awk

    awk -F'[" ]' '/VERSION=/{print $3,$4}'  /etc/os-release
    

    将字段分隔符设置为"space表示包含该行的3d和4rth字段VERSION=是我们要查找的字符串。

  3. sed

    sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
    

    -n开关禁止正常输出,将不打印任何行。该-r允许扩展正则表达式。然后,在匹配的行上VERSION=,我们将删除除最后两个单词以外的所有内容。在p末来打印。

  4. perl

    perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
    

    -n方法“与给出的脚本,每个输入行的过程-e。”在-l增加了一个换行符每个打印调用(和一些其他的东西,这是不relevevant这里)。正则表达式匹配的最后两个词(\b是一个字的边界)和如果行包含,则将它们打印出来VERSION=

  5. coreutils

    grep VERSION= /etc/os-release | cut -d ' ' -f 2-  | tr -d '"' 
    

    在这里,我们只是grep相关行,并使用cut将字段分隔符设置为space-d ' ')并打印从第二个字段到该行结尾的所有内容。该tr -d命令将从"末尾删除。

  6. 纯壳(无耻地窃取@gniourf_gniourf的聪明source主意):

    . /etc/os-release && echo ${VERSION//[0-9,. ]/ }
    

    .人士这使得变量提供给外壳和我使用bash的文件字符串处理功能删除版本号。


1

使用正则表达式,您可以执行以下操作:

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`来避免包含数字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.