如何添加文本块

时间:2012-08-24 16:54:14

标签: perl sed

我正在尝试在类似的巨大文本文件中添加nagios服务检查。 我想搜索每个主机名(作为模式),并在四行之后追加新的服务检查块。每次出现host_name后,脚本都应该能够附加新的服务检查块。

                     OR

希望在两个连续的行中搜索两个模式,并在文本文件中的每次出现时在两个搜索的模式之间插入文本块。

P1 - notification_options d,r P2 - }

我只知道sed的基础知识,任何帮助都会非常感激。

define service{
            use                     new
            host_name               new
            active_checks_enabled   0
            check_freshness         0
            service_description     new
            check_command           new
            check_period            24x7
}

define host{
    use                     linux
    host_name               lotus
    alias                   lotus
    address                 10.1.1.1
    notification_options    d,r
}
define service{
            use                     linux
            host_name               lotus
            active_checks_enabled   0
            check_freshness         0
            service_description     Host Alive
            check_command           check-host-alive
            check_period            24x7
}

define service{
            use                     linux
            host_name               lotus
            active_checks_enabled   0
            check_freshness         0
            service_description     CPU
            check_command           check_cpu!95!100
            check_period            24x7
            notification_options    w,c,r
}


define host{
    use                     linux
    host_name               palm
    alias                   palm
    address                 10.1.1.2
    notification_options    d,r
}
define service{
            use                     linux
            host_name               palm
            active_checks_enabled   0
            check_freshness         0
            service_description     Host Alive
            check_command           checki_host
            check_period            24x7
}

define service{
            use                     linux
            host_name               palm
            active_checks_enabled   0
            check_freshness         0
            service_description     CPU
            check_command           check_cpu!95!100
            check_period            24x7
            notification_options    w,c,r
}


define host{
    use                     linux
    host_name               geeko
    alias                   geeko
    address                 10.1.1.3
    notification_options    d,r
}
define service{
            use                     linux
            host_name               geeko
            active_checks_enabled   0
            check_freshness         0
            service_description     Host Alive
            check_command           check_alive
            check_period            24x7
}

define service{
            use                     linux
            host_name               geeko
            active_checks_enabled   0
            check_freshness         0
            service_description     CPU
            check_command           check_cpu!95!100
            check_period            24x7
            notification_options    w,c,r
}

2 个答案:

答案 0 :(得分:1)

除非您需要定期执行此操作,否则听起来您想在文本编辑器中定义一个宏并使用一些聪明的搜索和替换技巧,或者,如果您确实需要一遍又一遍地执行此操作,您可能想要查看模板处理解决方案。

答案 1 :(得分:0)

这可能适合你(GNU sed):

cat <<\! >service.txt
> active_checks_enabled   0
> check_freshness         0
> service_description     Host Alive
> check_command           check-host-alive
> check_period            24x7
> }
> !
sed -i -e '/define host{/,/}/{/define host/h;/use/H;/host_name/H;/}/{G;s/host/service/;r service.txt' -e '}}' huge_text_file.txt