[英]AWK add line below a search pattern with variable and in a shell script
在shell脚本中使用awk行有一个小问题,我找不到我犯的错误。 希望任何人都能帮助我。
我使用awk版本20070501和Mac。
我正在使用以下代码在指定的模式下添加一行:
...
ANSHOSTGROUPS=($(egrep "^\[.*\]$" hosts))
INSERT="dc01.fritz.box ansible_ssh_host=192.168.4.27"
...
awk -v INSERT=$INSERT "/${ANSHOSTGROUPS[2]}/{print \$1;print INSERT;next}1" hosts > /tmp/tmp_hosts && mv -f /tmp/tmp_hosts hosts
我在文件“主机”中得到以下内容:
[test]
centos7-test.fritz.box
[lab]
dc01.fritz.box ansible_ssh_host=192.168.4.27
[ldap]
dc01.fritz.box ansible_ssh_host=192.168.4.27
[mysql]
dc01.fritz.box ansible_ssh_host=192.168.4.27
现在,当我使用以下命令直接在命令行上进行测试时:
awk -v INSERT="dc01.fritz.box ansible_ssh_host=192.168.4.27" "/\[ldap\]/{print \$1;print INSERT;next}1" hosts
我正确地得到
[test]
centos7-test.fritz.box
[lab]
[ldap]
dc01.fritz.box ansible_ssh_host=192.168.4.27
[mysql]
感谢你的帮助!
---在这里编辑,因为注释字段太小
好的,我使用问题中的文件内容来构建变量。 我现在用
ANSHOSTGROUPS=($(egrep "^\[.*\]$" hosts |sed 's/\[/\\\[/g' |sed 's/\]/\\\]/g'))
或只是使用
ANSHOSTGROUPS=(\[test\] \[lab\] \[ldap\] \[mysql\])
无需先构建文件即可进行测试。
现在变量显示了这一点:
echo ${ANSHOSTGROUPS[@]}
\[test\] \[lab\] \[ldap\] \[mysql\]
接下来,我尝试使用您的行: awk -v anshostgroup="${ANSHOSTGROUPS[2]}" -v insert="dc01.fritz.box ansible_ssh_host=192.168.4.27" '$0 ~ anshostgroup{$0=$1 ORS insert}1' hosts
之后,我得到了同样的错误输出,我在问题中写道。 我还尝试在没有两个管道的情况下构建变量并进行sed。 但是输出相同。
您包含在答案中的awk脚本应改为:
awk -v insert="$INSERT" -v anshostgroup="${ANSHOSTGROUPS[2]}" '$0 ~ anshostgroup{$0=$1 ORS insert}1' hosts > /tmp/tmp_hosts && mv -f /tmp/tmp_hosts hosts
我将您的awk变量名称更改为小写,因为FS
和RS
等内置名称全部为大写。 按照惯例,您不应该只使用全大写的外壳程序名称,而仅用于导出变量。
如果您发布了一些可测试的示例输入和预期的输出,我们也可以帮助您正确地完成脚本的其余部分(您不需要grep + sed + 2管道,但是在没有看到示例输入的情况下,我不会尝试找出尝试解析它的正确方法!)。
以下代码现在可以在Shell脚本中使用。 感谢乔纳森·莱夫勒!
...
ANSHOSTGROUPS=($(egrep "^\[.*\]$" hosts |sed 's/\[/\\\[/g' |sed 's/\]/\\\]/g'))
INSERT="dc01.fritz.box ansible_ssh_host=192.168.4.27"
...
awk -v INSERT=$INSERT "/${ANSHOSTGROUPS[2]}/{print \$1;print INSERT;next}1" hosts > /tmp/tmp_hosts && mv -f /tmp/tmp_hosts hosts
以防万一有人对使用或修改完整脚本感兴趣: https : //github.com/matze502/scripts/tree/master/bash/vmware/fusion
我使用脚本自动克隆一个虚拟机,以便与vmware融合一起用于实验室。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.