0

我正在尝试获取不带引号的发行版名称。

cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1

回报: "CentOS Linux"

现在,使用 shell 替换,我尝试删除将命令放在子 shell 中的引号:

echo ${$(cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1)/\"}

\"我在想我可以使用然后省略最后一个/来简单地删除引号来逃避引号。

编辑:我知道这可以用 来完成awk,但我不知道怎么做。

编辑:输出cat /etc/*-release

CentOS Linux release 7.2.1511 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.2.1511 (Core)
CentOS Linux release 7.2.1511 (Core)

预期输出:CentOS Linux

4

3 回答 3

2

/etc/os-release似乎是一组简单的 shell 赋值语句;您可以简单地获取它并输出$NAME(使用子shell以避免潜在地覆盖当前shell中的任何变量)的值:

( . /etc/os-release; echo "$NAME" )

这可能是一个安全风险,具体取决于您的信任级别,/etc/os-release无论出于何种原因可能包含其他可执行代码。

根据您的实际需要,您也可以简单地使用/etc/centos-release,其中包含您想要的信息作为一个简单的字符串。(当然,您可能不会假设您的脚本将在 CentOS 机器上运行。os-release似乎是一个更加与发行版无关的版本。)

于 2017-01-17T12:42:14.853 回答
1

使用awk,获取NAME变量后面的操作系统名称。

awk -F"=" '$1=="NAME"{gsub(/"/, "", $2);print $2; exit}' /etc/os-release 
CentOS Linux
于 2017-01-17T12:44:01.287 回答
0

您的解决方案几乎可以工作。中的引号"CentOS Linux"是发布文件的一部分,使用子外壳没有帮助。您可以使用cut双引号作为分隔符:

cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1 | cut -d '"' -f2

您可以使用sedwith

sed -n '/^NAME=/ {s/NAME="\(.*\)".*/\1/p;q}' /etc/*-release 

说明: 告诉sed只打印要求的p行,查找以 开头的行NAME=,匹配引号之间的部分,并在第一行之后以 退出NAME=

于 2017-01-17T16:38:32.137 回答