我在一个文件中有多个虚拟主机,我希望将每个虚拟主机分解为与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
我看了这个问答,这最接近我正在寻找的内容,但我不确定如何匹配两条线。它尝试了嵌套的 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
如果您确定虚拟主机定义由空行分隔,则可以使用 Perl 的“段落模式”slurp,它将其输入文件分段为由一个或多个空行分隔的行块,并逐块处理文件 -块而不是逐行(这可能是导致脚本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