我想得到forwarders {
和};
之间的线路,这些是IP地址,下面是模仿我的数据的示例文件..
// Red Hat BIND Configuration Tool
//
// THIS IS THE SLAVE DDNS SERVER -
//
// Currently running in chroot environment
// Prefix all file names below with /var/named/chroot
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
recursion yes;
check-names master ignore;
check-names slave ignore;
check-names respocope ignore;
max-journal-size 2M;
allow-query { any; };
allow-update {
key copdcop1.example.com.;
key copdcop2.example.com.;
key copdcop3.example.com.;
key copdcop4.example.com.;
};
forward only;
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
};
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
我可以使用shell或python或awk的任何解决方案。
我尝试用sed但没有运气..
sed -n '"/forwarders {"/,/"};"' dns.txt
但是,下面的awk代码工作..
awk '/forwarders {/{flag=1;next}/};/{flag=0}flag' dns.txt
编辑:由于OP要求输出到单行,所以现在添加以下解决方案。
awk 'BEGIN{OFS=","} /}/{found=""} /forwarders {/{found=1} found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){gsub(/ +/," ");val=(val?val OFS:"")$0}END{print val}' Input_file
或非一种内衬形式的解决方案。
awk '
BEGIN{
OFS=","
}
/}/{
found=""
}
/forwarders {/{
found=1
}
found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
gsub(/ +/," ")
val=(val?val OFS:"")$0
}
END{
print val
}' Input_file
或者如前所述,要在forwarder块内打印任何内容,请尝试:
awk '/}/{found=""} /forwarders {/{found=1;next} found{gsub(/ +/," ");val=(val?val OFS:"")$0} END{print val}' Input_file
您可以尝试一下(考虑到您只需要在标签内打印IP地址)。
awk '/}/{found=""} /forwarders {/{found=1} found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)' Input_file
如果转发器标记你想要什么,然后尝试跟随。
awk '/}/{found=""} /forwarders {/{found=1;next} found' Input_file
sed -n '/forwarders {/,/};/{//!p}' file
鉴于您的样本输出:
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
1192.20.28.8; // copdcop1
这实际上取决于文件可以更改多少。
但这适用于您的示例:
awk '/forwarders {/{flag=1;next}/};/{flag=0}flag' /path/to/file
对于你的例子:
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