代码之家  ›  专栏  ›  技术社区  ›  Ashutosh

在文件中的某个模式之前插入行的最佳方式是什么?

  •  0
  • Ashutosh  · 技术社区  · 6 年前

    这是一个用于000-site.conf的apache2配置文件。 它的配置如下:

    <Proxy balancer://mycluster>
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node1 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node2 loadfactor=1 keepalive=on  ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node3 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node4 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node5 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node6 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node7 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                    ProxySet lbmethod=byrequests
            </Proxy>
    

    我要做的是插入一个新的balancer成员 # 在队伍前面 ProxySet lbmethod=byrequests .我将使用shell脚本来执行此操作。

    所以看起来应该是: #BalancerMember "ajp://10.x.x.xxx:8009" route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60

    另外,我将使用IP地址作为变量和节点号。

    我将编写代码来增加节点数。我试过通过给出行号并使用sed,但我希望它是动态的,而不是静态的。

    我需要一个最佳实践来解决这个问题。请帮助我你的想法和最佳做法。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Ashutosh    6 年前

    如果这对你有帮助,请告诉我。

    awk -v s1='"' '
    /ProxySet lbmethod=requests/{
      print ORS "#BalancerMember " s1 "ajp://10.x.x.xxx:8009" s1 " route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60"  ORS $0
      next
    }
    1'  Input_file > temp_file && mv temp_file Input_file
    

    所以,从@ravindersingh13的答案中,我修改了一下,得到了我想要的精确解。

    #!/bin/bash
    your_ip='10.6.0.8'
    ip="$your_ip";no="8"; awk -v line="#BalancerMember \"ajp://${ip}:8009\" route=node${no} loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60" '
    /ProxySet lbmethod=byrequests/{
    print "             " line ORS $0
    next
    }
    1' /tmp/000-site.conf > /tmp/000-site.conf.tmp && mv /tmp/000-site.conf.tmp /tmp/000-site.conf
    

    这个脚本接受shell变量并在awk变量中使用它。

        2
  •  1
  •   zedfoxus    6 年前

    如果你想试试 sed ,下面是一个示例:

    sed 's_ProxySet lbmethod=byrequests_#BalancerMember "ajp://10.x.x.xxx:8009" route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60\n\t\tProxySet lbmethod=requests_g' 000-site.conf
    

    结果

    <Proxy balancer://mycluster>
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node1 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node2 loadfactor=1 keepalive=on  ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node3 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node4 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node5 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xx:8009" route=node6 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                     BalancerMember "ajp://10.x.x.xxx:8009" route=node7 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
                    #BalancerMember "ajp://10.x.x.xxx:8009" route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60
            ProxySet lbmethod=requests
            </Proxy>
    

    解释

    塞德 在报价中使用替换 's_old-string_new-string_g' 在文件000-site.conf中。

    旧字符串是 ProxySet lbmethod=byrequests

    它被替换为 #BalancerMember "ajp://10.x.x.xxx:8009" route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60\n\t\tProxySet lbmethod=requests 是的。这个 \n\t\t 要求sed引入一个新行和两个制表符,后跟旧字符串。

    写回文件

    您可以编写命令以生成000-site.conf备份文件,并编写包含 #BalancerMember... 像这样进入000-site.conf:

    cp 000-site.conf 000-site.conf.orig
    
    sed 's_ProxySet lbmethod=byrequests_#BalancerMember "ajp://10.x.x.xxx:8009" route=node8 loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60\n\t\tProxySet lbmethod=requests_g' 000-site.conf.orig > 000-site.conf
    

    资源

    https://linuxconfig.org/learning-linux-commands-sed

    http://www.grymoire.com/Unix/Sed.html

    编辑

    如果您正在使用 塞德 命令,您可以执行以下操作:

    #!/bin/bash
    
    a=10.0.0.1
    no=11
    
    cp 000-site.conf 000-site.conf.orig
    
    sed 's_ProxySet lbmethod=byrequests_#BalancerMember "ajp://'$a':8009" route=node'$no' loadfactor=1 keepalive=on ttl=300 max=400 timeout=300 retry=60\n\t\tProxySet lbmethod=requests_g' 000-site.conf.orig > 000-site.conf
    
        3
  •  1
  •   potong    6 年前

    这可能对你有用(gnu sed):

    ip='myip://1.2.3.4:1234' n='8'
    
    sed -ri ':a;h;n;/ProxySet/{x;s@(\S.*").*(".*node)[0-9]*@#\1'$ip'\2'$n'@p;x};ba' file
    

    延迟打印每一行(第一行除外),并将前一行存储在保留空间(hs)中。如果当前行包含 ProxySet 将hs中的前几行副本修改为所需结果,并首先打印。

    N.B.使用 @ 作为替换命令中的分隔符,以避免引用 /