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