如何在文件Linux中的两个字符串之间获取数据

时间:2019-04-29 10:03:36

标签: python-3.x shell awk csh

我想获取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

3 个答案:

答案 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