如何获取文件中两个字符串之间的数据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