awk -v返回错误

时间:2016-01-18 16:35:31

标签: shell variables awk

我只需要在目录中保留最近的4个文件。我使用了以下命令:

for i in range(len(names)):
    names[i] =[names[i]]*len(links[i])

那是有效的。我想使用变量NUM_TO_KEEP而不是'4',所以我尝试了以下内容:

rm -f `ls -t $SOMEDIR/archive/* | awk 'NR>4'`

我收到以下错误:     awk:第1行附近的语法错误     awk:在第1行附近拯救

我也试了一个简单的     ls | awk -v var =“foo”'NR> 4'

我得到同样的错误。 我在linux和solaris上尝试这个,并为两个操作系统获得相同的错误。 关于我做错了什么的任何想法?我的问题是关于我在使用'-v'选项时遇到的错误,只要在-v选项旁边设置变量,我就会收到错误。 (ls | awk -v'NR> 4'有效,ls | awk -v =“foo”'NR> 4'给出错误)

1 个答案:

答案 0 :(得分:3)

虽然这被称为dup,而其他类似问题确实解决了部分问题(如何在awk脚本中访问shell变量值),但是获得特定错误消息的真正原因是{{1是你正在使用旧的,破坏的awk(Solaris上的usr / bin / awk),它会为大多数awk脚本生成错误消息,无论是有效还是其他。如果可能的话,使用GNU awk,否则在Solaris上使用/ usr / xpg4 / bin / awk(或者nawk但它与POSIX兼容性较低)。

绝对没有人应该使用旧的,破坏的awk,所以不要基于假设有人可能正在使用它来限制你的代码。如果他们那么他们需要更新他们的PATH而不是那样做。我非常惊讶你在linux上发现了它的一个版本,我以为只有Solaris才能解决这个问题。如果你正在编写一个shell脚本,你可以确保在调用awk之前在PATH中跳过它,例如伪代码:

awk: syntax error near line 1 awk: bailing out near line 1

或:

if (I'm on Solaris)
then
    AWK=/usr/xpg4/bin/awk
else
    AWK=$(which awk)
fi
$AWK -v x=y 'script' file

或其他测试你的PATH中第一个awk的东西是旧的,破坏了awk,如果是这样就跳过它到另一个awk