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

问题描述 投票:3回答:3

我想得到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
python-3.x shell awk csh
3个回答
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

或者如前所述,要在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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.