繁体   English   中英

在Shell脚本中的AWK在带有变量的搜索模式下添加一行

[英]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变量名称更改为小写,因为FSRS等内置名称全部为大写。 按照惯例,您不应该只使用全大写的外壳程序名称,而仅用于导出变量。

如果您发布了一些可测试的示例输入和预期的输出,我们也可以帮助您正确地完成脚本的其余部分(您不需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM