将 Apache 虚拟主机拆分为单独的文件

将 Apache 虚拟主机拆分为单独的文件

我在一个文件中有多个虚拟主机,我希望将每个虚拟主机分解为与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

相关内容