2015-10-18 153 views
0

继续,Awk doesn't match all match all my entries,我现在正在尝试编写一个脚本来在不同的机器上执行此操作。在脚本中,我想运行/ usr/xpg4/bin/awk,如果它存在其他常规awk。 我不能做简单的事情,因为我的脚本太复杂 - 我不想做一些用户友好的事情,它有一些选择。 所以我记录正确的AWK的变量是这样的:执行命令从变量

command='awk '"'"'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) { print substr($0,RSTART,RLENGTH) ";\n" }'"'"; 

之后我尝试执行

码= $($命令$文件);

我得到这个错误:

awk: command line:1: 'match($0,/^[[:alpha:]_][[:alnum:]_]*\**[[:space:]]+[[:alpha:]_][[:alnum:]_]*[[:space:]]*\([^)]*\)/) 
awk: command line:1:^bad character « ' » in expression 

,如果我把他们赶走,这并不意味着什么...

+1

[不要把命令放在字符串中。使用数组](http://mywiki.wooledge.org/BashFAQ/050)。 –

+1

为什么你把代码放入数据?为什么不使用函数而不是变量?也相关:[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

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";有优点和缺点。

如果你需要不同的awk脚本(的Solaris?)awk的不同亚种,那么你就可以创建不同的script.awk文件,并仍然使用通用符号与-f script.awk执行脚本。

并没有义务使用名称script.awk;它只是说明性的。事实上,如果您实时创建它,则应确保它是唯一命名的(例如,通过将$$(当前进程ID)添加到名称中)。谨防安全问题。我不确定Solaris是否附带mktemp命令来安全地创建临时文件。

+0

当然有前面的测试,但我测试脚本后就省略了。 我宁愿只有一个文件,所以没有外部的awk脚本。 –

+0

它对报价效果更好,谢谢! –