如何获取文件中两个字符串之间的数据Linux
How to take the data between two strings in a file Linux
我想获取 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
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
编辑: 由于 OP 要求将输出输出到单行中,因此现在添加以下解决方案。
awk 'BEGIN{OFS=","} /}/{found=""} /forwarders {/{found=1} found && match([=10=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){gsub(/ +/," ");val=(val?val OFS:"")[=10=]}END{print val}' Input_file
OR 非线性形式的解决方案。
awk '
BEGIN{
OFS=","
}
/}/{
found=""
}
/forwarders {/{
found=1
}
found && match([=11=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
gsub(/ +/," ")
val=(val?val OFS:"")[=11=]
}
END{
print val
}' Input_file
或者如前所述,要在转发器块内打印任何内容,请尝试:
awk '/}/{found=""} /forwarders {/{found=1;next} found{gsub(/ +/," ");val=(val?val OFS:"")[=12=]} END{print val}' Input_file
能否请您尝试以下(考虑到您只需要在标签内打印 IP 地址)。
awk '/}/{found=""} /forwarders {/{found=1} found && match([=13=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)' Input_file
如果货代标记您想要的任何东西,请尝试跟随。
awk '/}/{found=""} /forwarders {/{found=1;next} found' Input_file
我想获取 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
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
编辑: 由于 OP 要求将输出输出到单行中,因此现在添加以下解决方案。
awk 'BEGIN{OFS=","} /}/{found=""} /forwarders {/{found=1} found && match([=10=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){gsub(/ +/," ");val=(val?val OFS:"")[=10=]}END{print val}' Input_file
OR 非线性形式的解决方案。
awk '
BEGIN{
OFS=","
}
/}/{
found=""
}
/forwarders {/{
found=1
}
found && match([=11=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
gsub(/ +/," ")
val=(val?val OFS:"")[=11=]
}
END{
print val
}' Input_file
或者如前所述,要在转发器块内打印任何内容,请尝试:
awk '/}/{found=""} /forwarders {/{found=1;next} found{gsub(/ +/," ");val=(val?val OFS:"")[=12=]} END{print val}' Input_file
能否请您尝试以下(考虑到您只需要在标签内打印 IP 地址)。
awk '/}/{found=""} /forwarders {/{found=1} found && match([=13=],/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)' Input_file
如果货代标记您想要的任何东西,请尝试跟随。
awk '/}/{found=""} /forwarders {/{found=1;next} found' Input_file