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

Linux下提取文件中forwarders {与};之间的IP地址

提取BIND配置中forwarders块内的IP条目

我注意到你尝试用sed提取BIND配置里forwarders {和};之间的内容没成功,这里给你几个靠谱的解决方案,涵盖awk、调整后的sed还有Python脚本,都能精准拿到你想要的结果:

1. 已验证可行的awk方案

你提到的这个awk命令确实好用,它通过标记位来控制输出,逻辑很清晰:

awk '/forwarders {/{flag=1;next}/};/{flag=0}flag' dns.txt

简单解释:

  • 当匹配到forwarders {时,设置标记flag=1,并跳过当前行(避免输出这行本身)
  • 当匹配到};时,把标记flag=0,停止输出后续内容
  • 只要flag为1,就输出当前行,正好对应两个标记之间的所有IP条目

2. 修复后的sed方案

你之前的sed命令语法有小问题,调整成下面这样就能正常工作了:

sed -n '/forwarders {/,/};/ {//!p}' dns.txt

简单解释:

  • -n:让sed只输出我们指定的行,避免默认输出所有内容
  • /forwarders {/,/};/:定位到forwarders {到};之间的行范围
  • {//!p}:在这个范围内,跳过匹配标记本身的行(//!表示不匹配当前模式),只打印中间的内容

3. Python脚本方案

如果更习惯用Python处理文本,这个脚本可以轻松完成提取:

with open('dns.txt', 'r') as f:
    lines = f.readlines()

output_flag = False
for line in lines:
    line = line.rstrip('\n')
    if 'forwarders {' in line:
        output_flag = True
        continue
    if '};' in line:
        output_flag = False
        continue
    if output_flag:
        print(line)

简单解释:

  • 先把配置文件的内容全部读进来,然后逐行处理
  • 用output_flag变量控制是否输出当前行:遇到forwarders {就开启标记,遇到};就关闭标记,中间的行直接打印

运行以上任意一种方法,都能得到你期望的结果:

192.168.174.131; // cop-no1
192.155.98.74; // cop-jn1
192.168.2.40; // cop-sad1
192.168.2.56; // cop-s1
192.43.4.70; // cop-che1
192.20.28.8; // copdcop1

内容的提问来源于stack exchange,提问作者user2023

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:34:31