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,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
XML Java Linux
Linux替换文件字符串和合并文件命令
Linux替换文件字符串和合并文件命令
|
4月前
|
存储 Python
基于Python一次性批量修改多个文件的文件名
基于Python一次性批量修改多个文件的文件名
|
4月前
|
定位技术 Python
PowerShell批量修改、替换大量文件的文件名
PowerShell批量修改、替换大量文件的文件名
|
10月前
|
Shell Perl
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行
把当前目录(包含子目录)下所有后缀为 “.sh” 的文件后缀变更为 “.shell”,之后删除每个文件的第二行。
54 1
|
Linux 开发工具
Linux:vim文本单行替换和全局替换
Linux:vim文本单行替换和全局替换
90 0
|
Shell Linux Perl
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容
shell 定义绝对路径,出错 sed: 未找到命令,脚本功能:替换某一行内容
|
Python
python 批量修改文件名
尚有欠缺,可以匹配正则。实现一个加强版的文件名修改神器
1576 0
python批量更改目录名/文件名
简介:跑模型和测试一些批量操作时,常常需要一个或多个文件中的文件的命名格式具有一定的规律。有时候获取的数据又是从一些网站爬取下来的,数据名具有一定的不规律性,这是就需要我们去重命名这些文件。10,20个还好说,如果是上百个,上千个,甚至上万个呢?我们还能去手动命名吗?显然不可能的!这时就需要批量更改文件名的操作。
python批量更改目录名/文件名
|
Python
Python - 批量修改文件名
Python - 批量修改文件名
178 0