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

Bash 在文件中的某个模式之前插入行的最佳方式是什么?,bash,shell,awk,sed,pattern-matching,Bash,Shell,Awk,Sed,Pattern Matching,这是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.x

这是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>
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

“成员”ajp://10.x.x.xxx:8009“路由=节点1负载因子=1 keepalive=on ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xx:8009“路由=节点2负载因子=1 keepalive=on ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xxx:8009“路由=节点3负载因子=1 keepalive=开启ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xx:8009“路由=node4负载因子=1 keepalive=on ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xx:8009“路由=节点5负载因子=1 keepalive=开启ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xx:8009“路由=节点6负载因子=1 keepalive=开启ttl=300最大值=400超时=300重试=60
“成员”ajp://10.x.x.xxx:8009“路由=节点7负载因子=1 keepalive=开启ttl=300最大值=400超时=300重试=60
ProxySet lbmethod=byrequests
我要做的是在
ProxySet lbmethod=byrequests
行之前插入一个新的BalancerMember。我将使用shell脚本来实现这一点

所以它应该看起来像:
#平衡器成员”ajp://10.x.x.xxx:8009“路由=节点8负载因子=1 keepalive=开启ttl=300最大值=400超时=300重试=60

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

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


我需要此解决方案的最佳实践。请帮助我了解您的想法和最佳实践。

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

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变量中使用它。

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

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变量中使用它。

如果您想尝试
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>
资源

编辑

如果在shell中使用
sed
命令,可以执行以下操作:

#!/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

如果您想尝试
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>
资源

编辑

如果在shell中使用
sed
命令,可以执行以下操作:

#!/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
这可能适用于您(GNU-sed):

延迟打印每一行(第一行除外),并将前一行存储在保留空间(HS)中。如果当前行包含
ProxySet
修改前几行,在HS中复制到所需结果,然后首先打印

注意:在替换命令中使用
@
作为分隔符,以避免引用
/

,这可能适用于您(GNU-sed):

延迟打印每一行(第一行除外),并将前一行存储在保留空间(HS)中。如果当前行包含
ProxySet
修改前几行,在HS中复制到所需结果,然后首先打印



注意:在替换命令中使用
@
作为分隔符,以避免引用
/

请始终尝试在您的帖子中显示您为解决问题所做的努力,因为我们都在这里学习。这是SO
awk
sed
论坛中非常常见的问题,因此请尝试使用SO的搜索功能并从中学习。感谢您的建议,请记住。@Ashutosh您有两个有效的答案。请通过将其中一个问题标记为已回答来结束您的问题。wrt
我将编写代码以增加节点数。
-如果您正在考虑调用在shell循环中重复执行一次的awk脚本以多次执行此操作,这可能完全没有必要,而且通常是个坏主意。那么你有什么建议呢?请在你的帖子中展示你为解决问题所做的努力,因为我们都是来学习的。这是SO
awk
sed
论坛中非常常见的问题,因此请尝试使用SO的搜索功能并从中学习。感谢您的建议,请记住。@Ashutosh您有两个有效的答案。请通过将其中一个问题标记为已回答来结束您的问题。wrt
我将编写代码以增加节点数。
-如果您正在考虑调用在shell循环中重复执行一次的awk脚本以多次执行此操作,这可能完全没有必要,而且通常是个坏主意。那么你有什么建议呢???@Ashutosh,
s1
是awk变量,其中包含
ORS
是awk开箱即用的变量,其中包含新行。我不明白,当找到字符串的匹配项时,你想插入新行(我的意思是找到一行的匹配项)?@Ashutosh,在
awk
中,变量与shell不同,在
awk
中不需要转义,因此已将其放入变量。现在检查我的编辑吗?@Ashutosh,使用like
awk-v var=“$shell\u variable“….
不要在
awk
代码中使用
$var
它在awk中有不同的含义。@Ashutosh,简单地给变量命名,如
-vs2-vs3
etcOkay谢谢您的帮助@Ashutosh,
s1
是awk变量,其中包含
”,
ORS
是awk开箱即用的变量,其中包含新行。我不明白,在找到字符串匹配项(我指找到一行匹配项)时,您是否希望插入新行?@Ashutosh,在
awk
中,变量与shel不同