ファイルに複数の仮想ホストがあり、各仮想ホストを.を含むファイルに分割したいと思いますServerName
。このファイルを探しています。
<VirtualHost *:80>
ServerName host1.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName host2.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName hostN.example.com
</VirtualHost>
サブファイルとしてhost1.example.com
....hostN.example.com
私はこれを見たQ&A、これは私が探しているものに最も近いですが、2行をどのように一致させるのかわかりません。入れ子になったif文を試しましたが、
gawk '{
if(match($0, /(\<VirtualHost \*:80\>)/, v)){
if(match($0, / ServerName (.*)/, s)){
name=s[1]
{print name}
}}}
' samplevhost
そして
gawk '{
if(match($0, /(\<VirtualHost \*:80\>)(\n )(ServerName)(.*)/, k)){
name=k[1]
{print name}
}}
' samplevhost
画面に印刷されますが、出力は出ません。私は何を見逃していますか?
答え1
仮想ホスト定義が空行で区切られていると判断した場合は、入力ファイルを1つ以上の空行で区切られた行の塊に分割し、Notの代わりにファイルをファイルごとに処理するPerlの「ショートモード」slurpを使用できます。 1行ずつ(これはおそらくgawk
スクリプトの失敗の原因です)。以下を使用して「セクションごとに」ファイルを処理します-n00
(参照)。perlrun(1)
perl -n00 -e '
/ServerName\s+(.*)/;
$file = $1;
open $fh,">",$file or die "Failed to open file $file for writing: $!\n";
print $fh $_;
close $fh' your_file_here