2017-05-04 71 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