perl命令:批量修改替换文件

简介:

需求如下:有nginx负载均衡配置文件,更新某几台服务器需要先注释掉前端机器,需要用脚本实现;

之前一直用sed进行替换,遇到一个高手用perl命令也可以实现,命令更简洁直观,可以实现同样的效果。


举例如下:

[root@localhost ~]# cat host.conf

upstream test_server {

server   192.168.169.36:80;

server   192.168.169.37:80;

server   192.168.169.38:80;

server   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}


打印匹配的行

[root@localhost ~]# perl -ne 'print if /192.168.169.3/' host.conf

server   192.168.169.36:80;

server   192.168.169.37:80;

server   192.168.169.38:80;

server   192.168.169.39:80;

[root@localhost ~]# perl -ne 'print if /192.168.169.5/' host.conf

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;


perl命令:匹配192.168.169.3 网段的前面加#;

-i 写入到文件

[root@localhost ~]# perl -i -pe 's/(.*)/#$1/ if /192.168.169.3/' host.conf

执行结果如下:

[root@localhost ~]# cat host.conf

upstream test_server {

#server   192.168.169.36:80;

#server   192.168.169.37:80;

#server   192.168.169.38:80;

#server   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}


同理,去掉#

[root@localhost ~]# perl -i -pe 's/#(.*)/$1/ if /192.168.169.3/' host.conf

[root@localhost ~]# cat host.conf

upstream test_server {

server   192.168.169.36:80;

server   192.168.169.37:80;

server   192.168.169.38:80;

server   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}



匹配192.168.169. 网段的所有机器加#

[root@localhost ~]# perl -i -pe 's/(.*)/#$1/ if /192.168.169./' host.conf

[root@localhost ~]# cat host.conf

upstream test_server {

#server   192.168.169.36:80;

#server   192.168.169.37:80;

#server   192.168.169.38:80;

#server   192.168.169.39:80;

#server   192.168.169.50:80;

#server   192.168.169.51:80;

#server   192.168.169.52:80;

}



perl命令也支持类似sed的关键字替换

[root@localhost ~]#  perl -pe 's/server/master/ if /192.168.169.3/' host.conf

upstream test_server {

master   192.168.169.36:80;

master   192.168.169.37:80;

master   192.168.169.38:80;

master   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}



问题来了,实际配置文件基本都是同一个网段的ip,如果匹配的话,会匹配到其他机器上面,问题就严重了,所以需要按指定行进行精确匹配;

[root@localhost ~]# cat host.conf

upstream test_server {

server   192.168.169.36:80;

server   192.168.169.37:80;

server   192.168.169.38:80;

server   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}


perl命令,匹配指定的行

if 判断 $. 行数,与或关系进行匹配;

[root@localhost ~]#  perl -ne 'print if $.==2 ' host.conf

server   192.168.169.36:80;

[root@localhost ~]#  perl -ne 'print if $.==4 ' host.conf

server   192.168.169.38:80;

[root@localhost ~]#  perl -ne 'print if $.>=2 && $.<=5 ' host.conf

server   192.168.169.36:80;

server   192.168.169.37:80;

server   192.168.169.38:80;

server   192.168.169.39:80;


精确匹配,进行替换,大于等于第2行,小于等于第5行;

[root@localhost ~]# perl -pe 's/(.*)/#$1/ if $.>=2 && $.<=5' host.conf

upstream nav1_server {

#server   192.168.169.36:80;

#server   192.168.169.37:80;

#server   192.168.169.38:80;

#server   192.168.169.39:80;

server   192.168.169.50:80;

server   192.168.169.51:80;

server   192.168.169.52:80;

}


加-i 参数,将修改的操作写入到文件中;

[root@localhost ~]# perl -i -pe 's/(.*)/#$1/ if $.>=2 && $.<=5' host.conf





本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1920369,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
Linux Perl
linux 批量查找并替换文件里的指定字符串,linux 批量查找并替换当前目录下所有子目录内文件里的指定字符串
linux 批量查找并替换文件里的指定字符串,linux 批量查找并替换当前目录下所有子目录内文件里的指定字符串
43 0
|
5月前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
52 0
|
6月前
|
Shell Perl
几行shell,批量替换更改件名
几行shell,批量替换更改件名
24 1
|
6月前
|
定位技术 Python
PowerShell批量修改、替换大量文件的文件名
PowerShell批量修改、替换大量文件的文件名
156 1
|
6月前
|
存储 Python
基于Python一次性批量修改多个文件的文件名
基于Python一次性批量修改多个文件的文件名
|
Shell Perl
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行。
97 1
|
Python
python 批量修改文件名
尚有欠缺,可以匹配正则。实现一个加强版的文件名修改神器
1655 0
|
Linux 开发工具
Linux:vim文本单行替换和全局替换
Linux:vim文本单行替换和全局替换
125 0
|
Shell Linux Perl
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容