【发布时间】:2015-10-17 06:24:17
【问题描述】:
在 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 的情况下构建变量。但同样的输出。
【问题讨论】:
-
您正在尝试在 awk
${ANSHOSTGROUPS[2]中使用 shell 变量 -
当你使用
bash -x yourscript.sh时你看到了什么?具体来说,是否将正确的值代入awk脚本?手动代码在正则表达式元字符[前面有一个反斜杠(]前面有一个不太重要的反斜杠)。您的awk脚本没有这种保护;它只查找包含来自[ldap]的任何字母的行(因此a或d或l或 一个p)。至少,您需要将\\${ANSHOSTGROUPS[2]}放入awk脚本中。这可能就足够了。 -
我现在正在工作。我会在晚上检查,但你是对的。可能是
[。似乎合乎逻辑。我看看能不能把括号从变量中取出来。 -
嘿乔纳森,在你的帮助下我找到了错误。我刚刚将
ANSHOSTGROUPS=($(egrep "^\[.*\]$" hosts))更改为ANSHOSTGROUPS=($(egrep "^\[.*\]$" hosts |sed 's/\[/\\\[/g' |sed 's/\]/\\\]/g'))。正如您所说,awk 使用[]中的字母作为正则表达式。非常感谢!