批量機器服務升級時,需備份配置文件特定行/塊,升級後精準還原。手工操作耗時易錯,本腳本基於 sed 實現:
server.config:
ser_max_connection=6000 # 行模式
ser_min_connection=10
ser_time_out=60
ser_time_spent=120
server tcp_nodes{ # 塊模式,以 } 結束
ser_client_ip=ipv4
ser_client_len=20*N
ser_client_syn=yes
ser_client_ack=yes
}
backup 'server.config#+srcpattern#=request_src_type#+src_acl'
# +前綴 → 匹配塊(從該行到下一個 })
# =前綴 → 精確匹配鍵值行(鍵名匹配)
# 無前綴 → 行首正則匹配
備份文件標記:+ 開頭=塊、= 開頭=鍵值行、- 開頭=普通行。
sed -i 'start,/}/d' → 插入新塊sed -i 'line s/.*/new_value/'insert 'server.config#def p_r t_default#...#r_ww_switch#xxx=1-2-3'
# 參數:文件#定位行1#定位行2...#待插入行
# 邏輯:按順序匹配定位行,在最後一定位行後插入
insall 'server.config#pattern#new_line'
# 所有匹配 pattern 的行後插入 new_line
copy 'main.config#r.config' # 備份指定文件到 whole 目錄
rcopy 'main.config#r.config' # 還原並自動備份當前版本(帶時間戳)
| 特性 | 實現方式 |
|---|---|
| 遞歸掃描 | multidir() 函數遍歷目錄樹收集所有文件路徑 |
| IFS 分隔符處理 | 使用 # 作為參數分隔符,支持含空格路徑 |
| sed 進階用法 | 範圍刪除 start,/}/d、行後插入 line a\content、模式空間多行處理 |
| 原子性還原 | rcopy 先備份當前文件,還原失敗自動回滾 |
| 彩色日誌輸出 | \033[31m 紅色錯誤、\033[33m 黃色警告 |
# 備份 server.config 中 srcpattern 塊、request_src_type 鍵值、src_acl 塊
./config_tool.sh backup 'server.config#+srcpattern#=request_src_type#+src_acl'
# 還原所有備份
./config_tool.sh restore
# 還原指定文件
./config_tool.sh restore server.config
# 在 def p_r t_default 後插入 xxx=1-2-3
./config_tool.sh insert 'server.config#def p_r t_default#xxx=1-2-3'
# 刪除 r_ww_switch 行
./config_tool.sh delete 'server.config#r_ww_switch'
# 所有含 def p_r t_default 的行後插入
./config_tool.sh insall 'server.config#def p_r t_default#xxx=1-2-3'
# 備份/還原整文件
./config_tool.sh copy 'main.config#r.config'
./config_tool.sh rcopy 'main.config#r.config'
注意:腳本源自真實生產環境通用化改造,未經嚴格測試,生產使用前請在測試環境充分驗證。交流群:63565867。