2020-03-30 18:51:35
带着需要使用sed来对nginx配置文件进行操作的强烈需求,于是开始了学习sed的高级应用。虽然之前也一直在用sed,但也只是接触到了s替换命令,其它高级的命令没用到,所以没有动力去学。一直觉得要学到点东西,前提是你现在有一问题,需要用到这个技术来解决,而且有强烈的渴望要把这个问题解决,这时候你学习这项技术会事半功倍。否则学习起来会非常的枯燥无味,效率低,甚至会放弃。下面是我最近学sed得出的成果,备忘一下,以防失忆。
一、列出所有虚拟的server_name和对应的root
sed -n " /servers*{/{ H :loop n;H /}/{ s/}//;x;H s/.*server_names*([^;]*);.*/1/p x s/.*roots*([^;]*);.*/1/p s/.*//g;x } /{/!b loop :loop1 n;H /}/!b loop1 b loop } " nginx-www.centos.bz.conf
二、删除指定server_name的虚拟主机
domain="www.centos.bz" sed -i -n " /servers*{/{ H :loop n;H /}/{ s/}//;x /.*server_names*$domain.*/d p;d } /{/!b loop :loop1 n;H /}/!b loop1 b loop } p " nginx-www.centos.bz.conf
代码有点多,就不具体分析了,具体说下如何找出server {} 代码块。
代码分析:
1、首先先关闭自动打印功能,即-n选项,因为下面会用到n命令,会自动打印,所以添加-n之后,使用n命令就不会自动打印了,需要打印时,使用p命令。
2、匹配 server {,如果匹配到,则把pattern space的内容添加到hold space,然后进入loop循环,执行n命令(n命令不必进入新的循环读取下一步到pattern space),再用H附加到hold space
3、判断是否找到代码块结束符},如果找到,进入server {}代码块处理阶段,处理完之后,进入下一个循环,继续找出下一个server{}。
4、如果找不到,再判断是否找到{,如果没有找到,进入loop循环
5、如果找到了{,表示存在if {},或者location {},则必要找到两个}才算是完整的server代码块。此时进入loop1循环,n命令读取下一行,附加到hold space。
6、再判断是否找到},如果没有找到,继续loop1循环,如果找到了,还需要一个},所以跳到loop循环。
7、如此循环下来,直接找到完整的server代码块。
关键的几点提示:
1、n命令是直接清空pattern space,并读取下一行到pattern space,而不需要进入新的循环。在这里的作用是,因为要把pattern space的内容附加到hold space,所以每读取一行,必需先清空pattern space,然后再附加到hold space,这样hold space才不会出现重复内容。要达到清空pattern space,读取下一行,进入下一循环可以做到,但进入下一循环后,必需重新匹配server {,而下一行肯定无法匹配,所以就达不到累积的效果。
2、hold space在这里很重要,它的内容来自pattern space对其进行附加操作。累积到完整的server代码块时,再与pattern space进行交换,交换之前必需把pattern space清空,这样交换后,hold space才能为空,为累积出下一个server代码块做准备。
最后还是建议使用sed的debug工具sedsed查看pattern space和hold space的变化。http://aurelio.net/projects/sedsed/
Cherokee配置虚拟主机支持PHP
06-15
使用nginx ngx_http_referer_module模块配置防盗链
06-28
UNIX/Linux下如何删除文件/目录
05-22
saltstack快速批量安装nginx
07-16
使用fpm工具制作nginx的rpm包
06-26
nginx配置basic_auth密码验证
06-13
Ubuntu 16.04配置nginx使用GeoIP
07-12
使用sed或awk显示指定行内容
06-26
配置haproxy在http请求头添加后端用户真实IP
07-05
Docker用户指南(15) – 默认bridge网络 – 绑定容器端口到主机
03-31
AWK 两个文件字段合并处理实例
06-28
CentOS 7配置并更换为本地或网络yum源
07-17
Debian 7 (Wheezy)安装配置Apache mod_fastcgi PHP-FPM
07-20
Docker命令行参考(11) – docker load从tar归档文件或STDIN导入镜像
07-20
E47指纹如何删除
06-18
H61及以上主机如何关闭前置和后置USB接口
02-29
Lenovo G550在Windows XP操作系统下触控板驱动安装方法
07-17
Linux ar建立或修改备存文件命令详解
06-23
Linux cu连接另一个系统主机命令详解
04-23
Linux 的系统服务及其配置
07-07
删除文件恢复大师下载
6.3M
下载顽固文件删除工具下载
1MB
下载Mareew Free Eraser(强力文件彻底删除软件) V1.1.3 绿色版
1.69 MB
下载h3c模拟器(网络虚拟环境配置工具) 1.5.2 正式版
59.1M
下载虚拟声卡(声卡驱动程序) V2.1 中文版
1.97MB
下载虚拟视频软件下载
24.94 MB
下载MVBOX虚拟视频下载
19.04 MB
下载RdpGuard(主机防护工具) v7.2.9 官方版
3.8M
下载Uninstall Tool(卸载删除工具) v3.5 破解版
3.63 MB
下载VirtualBox虚拟机(系统虚拟机运行工具) 5.2.16.123759 免费版
108.47MB
下载ceb文件阅读器下载
42.6M
下载d3d9(系统文件)2021 绿色版
530.9K
下载dopdf v7 虚拟打印机 v7.3 绿色中文版
64.72M
下载fastcopy(文件快速复制工具)V3.7.0 免费版
1.5M
下载pdf合并软件(pdf文件合并工具)v1.11 官方版
209.0M
下载virtual drive manager(虚拟驱动器管理工具) V1.32 绿色版
0.21MB
下载win7虚拟光驱(虚拟光驱应用软件)V1.0 绿色版
1.3M
下载烁光PDF转换器(文件格式转换工具) v1.2.2.0 免费版
42.46 MB
下载谷歌地球(虚拟地球仪软件) 5.0 最新版
52.3M
下载360杀毒v5.0.0.8160A官方免费版
36.93 MB
下载