我想获取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
答案 0 :(得分:4)
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
答案 1 :(得分:2)
这实际上取决于文件可以更改的数量。
但这将适用于您的示例:
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
答案 2 :(得分:1)
编辑: :由于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
也可以像前面提到的那样,在转发器块中打印任何内容,请尝试:
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