perl命令:批量修改替换文件
需求如下:有nginx负载均衡配置文件,更新某几台服务器需要先注释掉前端机器,需要用脚本实现;之前一直用sed进行替换,遇到一个高手用perl命令也可以实现,命令更简洁直观,可以实现同样的效果。
举例如下:
# 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 -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;
# 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 写入到文件
# perl -i -pe 's/(.*)/#$1/ if /192.168.169.3/' host.conf
执行结果如下:
# 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 -i -pe 's/#(.*)/$1/ if /192.168.169.3/' host.conf
# 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. 网段的所有机器加#
# perl -i -pe 's/(.*)/#$1/ if /192.168.169./' host.conf
# 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的关键字替换
#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,如果匹配的话,会匹配到其他机器上面,问题就严重了,所以需要按指定行进行精确匹配;
# 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 判断 $. 行数,与或关系进行匹配;
#perl -ne 'print if $.==2 ' host.conf
server 192.168.169.36:80;
#perl -ne 'print if $.==4 ' host.conf
server 192.168.169.38:80;
#perl -ne 'print if $.>=2 && $.=2 && $.=2 && $.
页:
[1]