如果分隔符与某个字符串匹配,则提取分隔符之间的字符串

如果分隔符与某个字符串匹配,则提取分隔符之间的字符串

文件 cat hosts.cfg

define host {
            host_name                             switchlan
            alias                                 switchlan
            address                               192.168.2.1
            icon_image_alt                        Switch
            icon_image                            base/switch40.gif
            statusmap_image                       base/switch40.gd2
            check_command                         check-host-alive
            check_period                          24x7
            notification_period                   24x7
            contact_groups                        +admins,noc-monitor
            use                                   generic-switch
}
define host {
            host_name                             localhost
            alias                                 localhost
            address                               127.0.0.1
            icon_image_alt                        Linux
            icon_image                            base/linux40.gif
            statusmap_image                       base/linux40.gd2
            check_command                         check-host-alive
            use                                   linux-server
            contact_groups                        +admins
}

在上面我需要提取“使用”值为“Switch”时主机的 IP 地址和主机名

我目前的做法是:

tr '\n' '\t' < hosts.cfg | sed s/}/}\\n/g |  sed 's/ \+ /,/g' | grep generic-switch lt4 | awk -F "," '{print $3 $ 7}'
  1. 删除新行字符。
  2. 当我们看到“}”时,在定义末尾再次添加新行。
  3. 用“'”替换空格。
  4. 找到包含字符串“generic-switch”的行。
  5. 仅打印主机名和 IP 地址。

我认为有更好的方法。请提出替代方案/优化建议。

答案1

Tcl 在这里是个不错的选择:该配置文件具有与 Tcl 兼容的语法:

$ cat parsehosts.tcl
proc define {name data} {
    array set host $data
    if {[string match {*switch*} [string tolower $host(use)]]} {
        puts "$host(host_name) $host(address)"
    }
}
source [lindex $argv 0]

$ tclsh parsehosts.tcl hosts.cfg
switchlan 192.168.2.1

因此,在 bash 中,你可以说

read hostname address < <(tclsh parsehosts.tcl hosts.cfg)
echo $hostname
echo $address

相关内容