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
相关产品推荐
相关产品推荐

