2016-11-10 50 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