文件 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}'
- 删除新行字符。
- 当我们看到“}”时,在定义末尾再次添加新行。
- 用“'”替换空格。
- 找到包含字符串“generic-switch”的行。
- 仅打印主机名和 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