我正在尝试使用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、RS、ORS,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值。