在此Awk doesn't match all match all my entries的延续中,我现在正在尝试编写一个脚本以在不同的机器上执行此操作。在脚本中,如果存在其他常规awk,我想运行/ usr / xpg4 / bin / awk。 我不能做一个简单的if else因为我的脚本太复杂了 - 我不想做一些用户友好的事情,它有一些选择。 所以我在这样的变量中记录了正确的awk:
command='awk '"'"'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) { print substr($0,RSTART,RLENGTH) ";\n" }'"'";
在我尝试执行之后
code = $($ command $ file);
我收到此错误:
awk: command line:1: 'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/)
awk: command line:1: ^ bad character « ' » in expression
如果我把它们拿走,这没有任何意义......
答案 0 :(得分:0)
粗略地说,不要这样做。
AWK=/usr/xpg4/bin/awk
if [ ! -x "$AWK" ]
then AWK="awk"
fi
然后你可以使用:
code=$("$AWK" '…your awk script…' "$file")
或者您可以将脚本放入文件script.awk
,然后使用:
code=$("$AWK" -f script.awk "$file")
我们可以围绕使用"$AWK"
来讨论双引号的优点;有利有弊。
如果您需要针对(Solaris?)awk
的不同子类别使用不同的awk
脚本,那么您可以创建不同的script.awk
文件,并且仍然使用{{{1}的通用表示法1}}执行脚本。
并且没有义务使用-f script.awk
这个名字;这只是说明性的。实际上,如果您在运行中创建它,则应确保它具有唯一名称(例如,通过将当前进程ID script.awk
添加到名称中)。注意安全问题。我不确定Solaris是否附带$$
命令来安全地创建临时文件。