【问题标题】:Shell script to delete lines matching a pattern and next subsequent lines following a different indentation用于删除与模式匹配的行以及不同缩进后的后续行的 Shell 脚本
【发布时间】:2019-11-30 06:24:40
【问题描述】:

我的 haxproxy 配置如下:

frontend bocluster
    bind <VIRTUAL IP>:8680
    mode tcp
    default_backend boservers
backend boservers
    balance roundrobin
    server boserver1 <HMASTER PRIVATE IP>:8780 check
    server boserver2 <HSECMASTER PRIVATE IP>:8780 check

我必须删除从匹配模式开始的行和下一个后续行,直到以不同缩进开始的行,例如:如果我选择模式为frontend bocluster,脚本必须删除这个模式和下一个在它下面三行。

【问题讨论】:

    标签: shell perl awk sed


    【解决方案1】:

    这个单行应该有帮助:(gawk)

    awk -v p="YOURLINE" '$0~"^"p{d=1;next}d&&/^\S/{d=0}!d' file
    
    • YOURLINE 替换为您想要的模式。
    • 此单行将删除整个“块”数据,而不是限制在模式之后的固定行。 (在您的示例中,它是三行)。

    小测试:

    kent$  cat f
    foo
            a
            b
            c
            d
    bar
            x
            y
            z
    blah
            some
            thing
            here
    
    kent$  awk -v p="foo" '$0~"^"p{d=1;next}d&&/^\S/{d=0}!d' f
    bar
            x
            y
            z
    blah
            some
            thing
            here
    
    kent$  awk -v p="bar" '$0~"^"p{d=1;next}d&&/^\S/{d=0}!d' f
    foo
            a
            b
            c
            d
    blah
            some
            thing
            here
    

    【讨论】:

    • 谢谢@Kent。我正在通过我们的 python 包装器执行您的awk 解决方案,它接受整个命令作为字符串并在给定的节点集群中执行它。 wrapper.py -n $CLUSTER_NODES -R -e "awk -v p=\"$1\" '$0 ~ \"^\"p {d=1; next} d &amp;&amp; /^\S/ {d=0} !d' /etc/haproxy/haproxy.conf &gt; tmp &amp;&amp; mv tmp /etc/haproxy/haproxy.conf"。我在引号中苦苦挣扎,$0 正在扩展到当前的 shell 脚本名称。基本上如何调试awk脚本?
    • ok 是这样实现的:wrapper.py -n $CLUSTER_NODES -R -e "awk -v p=\"$1\" '\$0 ~ \"^\"p {d=1; next} d &amp;&amp; /^\S/ {d=0} !d' /etc/haproxy/haproxy.conf &gt; tmp &amp;&amp; mv tmp /etc/haproxy/haproxy.conf"
    【解决方案2】:

    使用 GNU awk 和正则表达式匹配:

    $ awk -v re='frontend bocluster' '/^\S/{f=($0~"^"re)} !f' file
    backend boservers
        balance roundrobin
        server boserver1 <HMASTER PRIVATE IP>:8780 check
        server boserver2 <HSECMASTER PRIVATE IP>:8780 check
    

    与任何 awk 和正则表达式匹配:

    $ awk -v re='frontend bocluster' '/^[^[:space:]]/{f=($0~"^"re)} !f' file
    backend boservers
        balance roundrobin
        server boserver1 <HMASTER PRIVATE IP>:8780 check
        server boserver2 <HSECMASTER PRIVATE IP>:8780 check
    

    与任何 awk 和字符串匹配:

    $ awk -v str='frontend bocluster' '/^[^[:space:]]/{f=(index($0,str)==1)} !f' file
    backend boservers
        balance roundrobin
        server boserver1 <HMASTER PRIVATE IP>:8780 check
        server boserver2 <HSECMASTER PRIVATE IP>:8780 check
    

    等等......这取决于您拥有的 awk 版本以及您想要进行什么样的匹配 - 字符串与正则表达式、整体与部分等。

    【讨论】:

    • 谢谢@Ed Morton。有Perloneliner 吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多