2016-04-29 88 views
1

我有nagios/icinga目标文件具有下面类似的内容,但很多。我如何使用bash或python提取类似的对象,例如只有“主机对象”或“服务对象”。如何从文件中提取大括号之间的字符串

define host{   ## extract including the "define host {....}" 
    use    generic-switch 
    host_name  bras ; 
    alias   bras-gw.example.com; 
    address   20.94.66.88 
    hostgroups  bgp; 
} 

define host{ ## extract including the "define host {....} define host {....} " 
    use    generic-switch 
    host_name  ar1 ; 
    alias   ar1.example.com; 
    address   22.98.66.244 
    hostgroups  bgp; 
} 

define servicegroup { 
    servicegroup_name Premium 
    alias Premium-BGP 
} 
define service { 
    host_name    ar0 
    service_description  Get-Speed- BGP-INTL dsdf34 
    check_command   check_bgp!secreat!10.10.40.44 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 
} 

define service { 
    host_name    ar10 
    service_description  Get-Speed- BGP-INTL rrdf34 
    check_command   check_bgp!secreat!10.10.40.77 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 
    check_period       24x7 
      notification_period     24x7 
      contact_groups      p2p,l2,system2,admins 
      use         generic-service 
      max_check_attempts  3 
      notification_options c,r 
} 

目标是从文件中提取特定主机或服务对象,例如,

define host{ 
    use    generic-switch 
    host_name  ar0 ; 
    alias   id6.example.net; 
    address   20.24.6.22 
    hostgroups  bgp; 
} 
define host{ 
    use    generic-switch 
    host_name  bras ; 
    alias   bras-gw.abc.com.dp; 
    address   202.33.66.254 
    hostgroups  bgp; 
} 
define host{ 
    use    generic-switch 
    host_name  ar1 ; 
    alias   ar1.abc.com; 
    address   20.94.66.44 
    hostgroups  bgp; 
    } 

答:sed -nr '/.*(\bhost\b|\bservice\b).*\{/,/\}/ p' datafile 由@ ritesht93

+0

这种试图用sed -n“/ ^定义主机{/ ,/ \} $/p'bgp.cfg虽然有效,但我认为@ ritesht93提供的答案更好 –

回答

1

如果我理解正确的提供,你不需要servicegroup ..right?如果你想要的内容

$ sed -nr '/.*(\bhost\b|\bservice\b).*\{/,/\}/ p' data 
define host{   ## extract including the "define host {....}" 
    use    generic-switch 
    host_name  bras ; 
    alias   bras-gw.example.com; 
    address   20.94.66.88 
    hostgroups  bgp; 
} 
define host{ ## extract including the "define host {....} define host {....} " 
    use    generic-switch 
    host_name  ar1 ; 
    alias   ar1.example.com; 
    address   22.98.66.244 
    hostgroups  bgp; 
} 
define service { 
    host_name    ar0 
    service_description  Get-Speed- BGP-INTL dsdf34 
    check_command   check_bgp!secreat!10.10.40.44 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 
} 
define service { 
    host_name    ar10 
    service_description  Get-Speed- BGP-INTL rrdf34 
    check_command   check_bgp!secreat!10.10.40.77 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 
    check_period       24x7 
      notification_period     24x7 
      contact_groups      p2p,l2,system2,admins 
      use         generic-service 
      max_check_attempts  3 
      notification_options c,r 
} 
$ 

仅在大括号您可以使用此:

您可以使用此命令sed

$ sed -nr '/.*(\bhost\b|\bservice\b).*\{/,/\}/ p' data | sed -r '/^\s*define.*\{/d;s/\}/\n/g' 
    use    generic-switch 
    host_name  bras ; 
    alias   bras-gw.example.com; 
    address   20.94.66.88 
    hostgroups  bgp; 


    use    generic-switch 
    host_name  ar1 ; 
    alias   ar1.example.com; 
    address   22.98.66.244 
    hostgroups  bgp; 


    host_name    ar0 
    service_description  Get-Speed- BGP-INTL dsdf34 
    check_command   check_bgp!secreat!10.10.40.44 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 


    host_name    ar10 
    service_description  Get-Speed- BGP-INTL rrdf34 
    check_command   check_bgp!secreat!10.10.40.77 
    check_interval   1 
    use      generic-service 
    notification_interval 0 ; set > 0 if you want to be re-notified 
    check_period       24x7 
      notification_period     24x7 
      contact_groups      p2p,l2,system2,admins 
      use         generic-service 
      max_check_attempts  3 
      notification_options c,r 


$ 
+0

好的答案!但是,获取服务和组的大括号内容不是问题吗? – Inian

+0

@Inian OP表示他只需要'主机对象'和'服务对象',所以我认为这意味着不需要任何组,即没有'hostgroup'和'servicegroup' – ritesht93

+0

第一个像charm sed -nr'/一样工作。 *(\ bhost \ b | \ bservice \ b)。* \ {/,/ \}/p'数据 –

相关问题