You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:55:12