剪切Apache虚拟主机块



我正在尝试使用bash从文件中剪切某些虚拟主机,该文件中有很多虚拟主机。

例如。在我的脚本中,我想获得使用the_one_known2.example.com的虚拟主机,但另一次是the_one_known3.example.com,即我想获得一些部分形式的apache配置文件,该文件具有预先已知的URL(存在于ServerName或ServerAlias中(,该URL在bash脚本中设置为参数。

<VirtualHost *:80 *:${SERVER_PORT}>
ServerName      test1.example.com
ServerAlias     test2.example.com
ServerAlias     the_one_known1.example.com
ServerAlias     test3.example.com
</VirtualHost>
<VirtualHost *:80 *:${SERVER_PORT}>
ServerName      test4.example.com
ServerAlias     the_one_known2.example.com
ServerAlias     test5.example.com
ServerAlias     test6.example.com
</VirtualHost>
<VirtualHost *:80 *:${SERVER_PORT}>
ServerName      the_one_known3.example.com
ServerAlias     test7.example.com
ServerAlias     test8.example.com
ServerAlias     test9.example.com
</VirtualHost>

所以我的URL变量会更改为例如the_one_known2.example.com,我会得到:

<VirtualHost *:80 *:${SERVER_PORT}>
ServerName      test4.example.com
ServerAlias     the_one_known2.example.com
ServerAlias     test5.example.com
ServerAlias     test6.example.com
</VirtualHost>

[编辑]到目前为止,我试图找到选定虚拟主机的第一行:

url_line=$(grep -n -m 1 "${URL}" ./apache.conf" | sed  's/([0-9]*).*/1/')
vitual_host_start_line="$((app_line-1))" // this is an assumption that Virtual Host starts just one line before the first occurance of URL
echo $vitual_host_line // the place it starts

但我在找到这个虚拟主机的最后一行时遇到了问题,因为这是vitual_host_start_line之后第一次出现</VirtualHost>

使用awk:

awk -v name="the_one_known2.example.com" 'BEGIN{RS=ORS="</VirtualHost>n"} $0~name{print; exit}' file

我假设the_one_known2.example.com不是您文件中另一个域的子字符串。

参见:8个强大的Awk内置变量–FS、OFS、RSORS,NR、NF、FILENAME、FNR-

使用您显示的示例,请尝试以下awk代码。用GNUawk编写和测试。

awk -v RS='<VirtualHost[^/]*/' -v ORS="VirtualHost>n" 'RT~/[[:space:]]+the_one_known2.example.comn/{print RT}' Input_file

解释:简单的解释是,从<VirtualHost到下一个/出现RS(记录分隔符((非贪婪匹配(。然后检查它是否有[[:space:]]+the_one_known2.example.comn,如果是,则打印匹配的值,这将在文章结束时打印VirtualHost>,因为它在程序中被设置为ORS值。

相关内容

  • 没有找到相关文章

最新更新