在Ubuntu服务器的Bash中提取文件特定多行区块的方法
需求:提取指定backend区块内容并提取IP:PORT
问题背景
在Ubuntu服务器上使用Bash,需要从配置文件中提取backend mc-services区块内的内容,并进一步从中提取所有IP:PORT部分,纠结用awk、grep -P还是sed实现。
目标区块示例
backend mc-services [仅提取此区块] server SRV-003 [IP]:[PORT] [后续任意内容]
示例配置文件内容
backend md-demo mode http balance roundrobin server SRV-001 192.168.2.11:8783 check inter 5s rise 5 fall 5 maxconn 30 backend mc-services mode http balance roundrobin server SRV-003 192.168.2.13:8784 check inter 5s rise 5 fall 5 maxconn 30 server SRV-004 192.168.2.13:8785 check inter 5s rise 5 fall 5 maxconn 30 server SRV-003 192.168.2.14:8784 check inter 5s rise 5 fall 5 maxconn 30 server SRV-004 192.168.2.14:8785 check inter 5s rise 5 fall 5 maxconn 30 backend mc-services-int mode http balance roundrobin server SRV-009 192.168.2.11:8789 check inter 5s rise 5 fall 5 maxconn 30
解决方案
1. 使用awk(推荐,逻辑清晰易维护)
提取整个backend mc-services区块
awk '/^backend mc-services$/{flag=1; next} /^backend/{flag=0} flag' your_config_file
- 说明:
/^backend mc-services$/:匹配目标区块开头时,激活输出标记并跳过当前行/^backend/:匹配到其他backend区块开头时,关闭输出标记flag:标记激活时输出当前行
直接提取区块内的IP:PORT
无需先提取整个区块,可一步到位获取IP:PORT:
awk '/^backend mc-services$/{flag=1; next} /^backend/{flag=0} flag && /^ server/{print $3}' your_config_file
- 说明:标记激活且行是
server开头时,输出第3个字段(即IP:PORT)
2. 使用sed
提取整个区块
sed -n '/^backend mc-services$/,/^backend/{/^backend mc-services$/!{/^backend/!p}}' your_config_file
- 说明:
/^backend mc-services$/,/^backend/:定位目标区块的范围/^backend mc-services$/!:排除区块开头行/^backend/!p:排除下一个backend的开头行,输出中间内容
提取IP:PORT
sed -n '/^backend mc-services$/,/^backend/{/^ server/s/.* \([0-9.]\+:[0-9]\+\) .*/\1/p}' your_config_file
- 说明:在区块范围内匹配
server行,用正则捕获IP:PORT部分并输出
3. 使用grep(Ubuntu默认grep支持Perl正则)
提取整个区块(支持跨行匹配)
grep -Pzo '(?s)^backend mc-services$\n(?!^backend$).*?(?=\n^backend|\Z)' your_config_file
- 说明:
-z:将换行符视为普通字符,实现跨行匹配(?s):开启单行模式,让.能匹配换行符(?!^backend$).*?:匹配非backend开头的行,直到下一个backend或文件结束
提取IP:PORT
grep -A100 '^backend mc-services$' your_config_file | grep -v '^backend' | grep -oP '[0-9.]+\:[0-9]+'
- 说明:
-A100:输出目标行后100行(可根据实际调整行数)grep -v '^backend':过滤掉其他backend开头的行grep -oP:仅输出匹配到的IP:PORT部分
内容的提问来源于stack exchange,提问作者user3008410
相关产品推荐
相关产品推荐

