2016-11-10 49 views
1

我试图提取从/ etc/OS释放其中包含操作系统名称:如何从文件中有多条线路提取子

... 
NAME="Os Name" 
... 

但是,当我执行:

sed 's/.*NAME="\([^"]*\).*/\1/' /etc/os-release 

它正确地捕获Os名称,但它会打印所有其他打印仅捕获字符串的行,为什么?

内容OS-release文件的

cat /etc/os-release 
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" 

sed命令应该只输出 “的CentOS Linux的”,但它输出的所有行:

$ sed 's/.*NAME="\([^"]*\).*/\1/' /etc/os-release 
CentOS Linux 
VERSION="7 (Core)" 
ID="centos" 
ID_LIKE="rhel fedora" 
VERSION_ID="7" 
CentOS Linux 7 (Core) 
ANSI_COLOR="0;31" 
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" 

回答

2

您可以使用-n选项禁止常规输出和/p模式s命令在特定行上打印结果:

sed -nE 's/^NAME="([^"]+)".*/\1/p' /etc/os-release 

CentOS Linux 

您还可以使用AWK:

awk -F '["=]+' '$1=="NAME"{print $2}' /etc/os-release 

CentOS Linux 

或者使用grep -oP

grep -oP '^NAME="\K[^"]+' /etc/os-release 
+0

thansk,但为什么我的命令不起作用? –

+1

因为您没有使用'sed'的'-n'选项来抑制正常输出。 – anubhava

+0

但是这里[http://www.grymoire.com/Unix/Sed.html]说'默认情况下,sed打印每一行。如果它进行替换,新文本将被打印而不是旧文件',所以它应该只打印保存在\ 1中的字符串,否? sed是否在每一行都独立运行? –

1

你不需要sed这一点。只需grepcut应该这样做。

$ grep "^NAME=" /etc/os-release | cut -d\= -f2