2017-05-04 31 views
0

如何检索变量,即给定nginx.conf虚拟主机中server_name属性中的第一个域?Bash从nginx.conf解析server_name

我的虚拟主机存储为从nginx.conf主文件中分离出来的文件,虽然我可以grep并显示每个文件,但我期望做的是只抓取它找到的第一个域并回显它(最终,我“要是把它变成一个变量,这样我可以在其他地方使用它)

所以......如果我grep "server_name" /each/vhost/conf我呈现:

[email protected]:/home# grep "server_name" /home/site-configs/getyou 
     server_name getyou.onl; 
     server_name www.getyou.onl getme.onl www.getme.onl; 
[email protected]:/home# grep "server_name" /home/site-configs/kevinpirnie 
     server_name kevinpirnie.com www.kevinpirnie.com; 
[email protected]:/home# grep "server_name" /home/site-configs/airsweepinc 
     server_name airsweepinc.com www.airsweepinc.com; 
[email protected]:/home# grep "server_name" /home/site-configs/themedepot 
     server_name theme-depot.net www.theme-depot.net; 

什么我找上面给出的例子是:

[email protected]:/home# grep "server_name" /home/site-configs/getyou 
     getyou.onl 
[email protected]:/home# grep "server_name" /home/site-configs/kevinpirnie 
     kevinpirnie.com 
[email protected]:/home# grep "server_name" /home/site-configs/airsweepinc 
     airsweepinc.com 
[email protected]:/home# grep "server_name" /home/site-configs/themedepot 
     theme-depot.net 

回答

2

随着GNU grep和Perl的正则表达式:

$ grep -m1 -Poe 'server_name \K[^; ]+' getyou 
getyou.onl 

-m1只取第一个匹配,-P Perl的正则表达式,-o仅打印匹配部分。 \K是的Perl“在此之前忘记一切”,所以只有以下部分由-o印刷)

或者,如果你不喜欢或者不能使用grep -P,在Perl本身类似的操作。

$ perl -lne 'if (/server_name ([^ ;]+)/) {print $1; exit 0}' getyou 

或者GNU的sed:

$ sed -ne '/server_name/{s/.*server_name //; s/[; ].*//; p; q}' getyou 
+0

完美。这工作 – Kevin

+1

希望你注意到'-P是高度实验性'警告在GNU grep手册页,所以实际上并没有依赖它的任何重要或便携式... –

+0

@EdMorton,是否已知有(有)很多/严重的错误? (很难搜索'-P')我可以从十多年前找到对grep的'-P'的引用,并且很难相信PCRE库会被设计为一个简单的正则表达式太长。 – ilkkachu

1

grep "server_name" a|head -1|sed 's/^\s*//g'|cut -d ' ' -f2

+0

hmm ... close ...必须修改一下,因为它在'cut需要分隔符'时出错:'grep“server_name”/ home/site-configs/getyou |头-1 | cut -d''-f2'尽管显示最后一个';',但是我能做些什么来转储它,并只显示域? – Kevin

+0

明白了。非常感谢:添加到一个变量,并且做到了:'echo“$ {t //;}”' – Kevin

+0

没有'cut -d'''把每一个空格作为分隔符,所以任何带空格的缩进都会中断它(因为你需要计算空间才能知道正确的字段编号)? – ilkkachu

0

这将在任何工作AWK任何UNIX系统上:

awk '$1=="server_name"{sub(/;/,""); print $2; exit}' file