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
相關文章
- 批量修改檔名 與 批量檔案字元替換字元
- linux_perl批次替換檔案Linux
- grep、sed批量替換檔案內容shell
- find命令批量修改檔案字尾
- perl替換特殊字元字元
- python 檔案操作(二) 替換性修改檔案內容Python
- 通過替換frm檔案方式修改表結構
- 用python批量替換MD檔案中的圖片地址Python
- Linux下批量替換檔案中的字元 - sed (stream editor)Linux字元
- vim的批量替換
- dos命令:ren或rename,批量修改檔案字尾名
- Linux rename命令批量修改檔名Linux
- mysql批量替換指定字串MySql字串
- VI中的批量替換
- 批量修改檔案的編碼
- AIX/Linux下批量替換某類檔案中的某串字元AILinux字元
- mysql型別批量替換工具MySql型別
- linux批量替換指定資料夾中所有檔案的指定內容Linux
- vi替換命令
- linux 批量修改檔名字尾名命令renameLinux
- vim內替換檔案內容
- 文字編碼轉換工具iconv 附批量轉換檔案編碼命令
- 批量修改檔名
- RTF 批量轉換為 DOCX 檔案
- 批量修改檔案中的圖片名稱
- Linux 批量修改檔案字尾名Linux
- node實現檔案屬性批量修改(檔名)
- Python批量修改檔名和檔案型別Python型別
- puppet替換檔案中的string
- linux中批量替換文字中字串Linux字串
- pandas列值根據字典批量替換
- 使用變數替換批量部署GoldenGate變數Go
- java批量修改檔名Java
- linux下批量修改檔案中的字元Linux字元
- 在Linux中使用mmv命令批量修改檔名稱Linux
- perl檔案操作
- Linux 命令排列和命令替換Linux
- 同名檔案替換怎麼恢復,恢復同名檔案