在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
我在“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的情况下构建变量。但是输出相同。
答案 0 :(得分:1)
您在答案中包含的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
。您不应该按照惯例使用全大写的shell名称,而只是用于导出的变量。
如果您发布了一些可测试的样本输入和预期输出,我们也可以帮助您正确地获得脚本的其余部分(您不需要grep + sed + 2管道但是没有看到示例输入我不会去试图找出尝试解析它的正确方法!)。
答案 1 :(得分:0)
以下代码现在可以在shell脚本中使用。感谢Jonathan Leffler !!
...
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
我使用该脚本自动克隆vm以供vmware fusion实验室使用。