【问题标题】:Regex extract multiple line from file正则表达式从文件中提取多行
【发布时间】:2012-03-12 04:33:42
【问题描述】:

如何从给定文件“named.conf”中提取两个字段?我想要“区域”和“文件”字段。

zone "example.com" IN {
        type master;
        file "db.example.com";
        allow-query { any; };
        allow-update { none; };
        allow-transfer { 10.101.100.2; };
};

【问题讨论】:

  • (1) 您希望输出是什么样的? (2) 您的标题指定“正则表达式”。这是必需的吗? (3) 你试过什么?
  • @Daxim - 这应该是一个答案:)
  • 这很棒,但我想如果可能的话,我可以在 bash 中制作它,而不是下载并安装 perl 模块等。
  • Net::DNS::ZoneFile::Fast 不是一个可以工作的模块,仅供参考。它用于解析不是 named.conf 文件的区域文件。 [我知道;我是它的当前维护者:-) ]

标签: regex linux perl sed awk


【解决方案1】:

这可能对你有用:

sed '/^\s*\(zone\|file\) "\([^"]*\)".*/,//!d;//!d;s//\2/' named.conf
example.com
db.example.com

【讨论】:

  • 您能解释一下这个正则表达式是如何工作的吗? s//\2/是什么意思?
【解决方案2】:

试试这个又快又脏的 (GNU) AWK 程序(另存为 zone-file.awk):

/^zone/, /^}/ {
    if (NF == 4) {
        zone = $2
        next
    }

    if (NF == 2 && $1 == "file") {
        sub(";$", "", $2)
        print zone, $2
    }
}

它适用于我如下:

$ awk -f zone-file.awk /etc/named.conf
"." "named.ca"
"localhost" "localhost.zone"
[...]

【讨论】:

  • 我会简化一下:awk '$1 == "zone" || $1 == "file" {print $2}'
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2017-10-08
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多