如何使用sed/awk将多行LTM Pool配置合并为单行?
合并LTM Pool多行配置为单行的sed/awk实现方法
我有一个包含LTM Pool配置的文件,原始内容如下:
ltm pool /Common/foo_mim_pool { members { /Common/mim-foo-010101-1:5222 { address 10.22.1.161 } } } ltm pool /Common/foo_ts_pool { members { /Common/ts-vx-010101-1:6698 { address 10.20.1.68 } /Common/ts-vx-010101-1:6699 { address 10.20.1.68 } /Common/ts-vx-010101-2:6698 { address 10.21.1.199 } /Common/ts-vx-010101-2:6699 { address 10.21.1.199 } } monitor /Common/ts_monitor }
需要将每个LTM Pool的多行配置合并为单行,预期结果如下:
ltm pool /Common/foo_mim_pool { members { /Common/mim-foo-010101-1:5222 { address 10.22.1.161 } } } ltm pool /Common/foo_ts_pool { members { /Common/ts-vx-010101-1:6698 { address 10.20.1.68 } /Common/ts-vx-010101-1:6699 { address 10.20.1.68 } /Common/ts-vx-010101-2:6698 { address 10.21.1.199 } /Common/ts-vx-010101-2:6699 { address 10.21.1.199 } } monitor /Common/ts_monitor }
我尝试了以下命令,但未得到预期结果:
paste -d " " - - - - - - - - < file.txt awk 'NR%2{printf "%s ",$0;next;}1' file.txt
解决方案
方法1:使用sed实现
通过匹配pool的起始和结束标记,将块内换行替换为空格并去除冗余缩进:
sed -n '/^ltm pool/{:a;N;/}$/!ba;s/\n[[:space:]]*/ /g;p}' file.txt
- 逻辑说明:
/^ltm pool/{:定位到每个pool的起始行,开始处理:a;N;/}$/!ba:循环读取后续行,直到遇到以}结尾的pool结束行s/\n[[:space:]]*/ /g:把所有换行符及后续的缩进空格替换为单个空格p:输出合并后的单行配置
方法2:使用awk实现
通过跟踪pool配置块的状态,累积内容后统一输出:
awk '/^ltm pool/{block=$0; next} /}$/{block=block " " $0; gsub(/[[:space:]]+/," ",block); print block; block=""; next} {block=block " " $0}' file.txt
- 逻辑说明:
/^ltm pool/{block=$0; next}:遇到pool起始行,初始化存储块并跳过后续处理/}$/{...}:遇到pool结束行,将当前行加入块,替换连续空格为单个空格后输出,再重置存储块{block=block " " $0}:将pool块内的其他行追加到存储块中
内容的提问来源于stack exchange,提问作者Satish
相关产品推荐
相关产品推荐

