【问题标题】:awk -v returns errorawk -v 返回错误
【发布时间】:2016-04-23 21:59:56
【问题描述】:

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

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

这行得通。我想使用变量 NUM_TO_KEEP 而不是“4”,所以我尝试了以下方法:

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

我收到以下错误: 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' 给出错误)

【问题讨论】:

  • 在您的 awk 脚本中将 $num 更改为 num。
  • 顺便说一句,一种不易出错的方法(也就是说,一种不允许文件具有阻止它们被成功清理的名称的方法)是使用@987654327 @ 打印一个以 NUL 分隔的纪元时间/文件名对流,对该流进行数字排序,并杀死除前四个元素之外的所有元素。解析ls 被认为是代码异味是有原因的。
  • 至于你想要做什么,stackoverflow.com/a/299911/14122 是一个比必要的实现稍微复杂一些。
  • ...而stackoverflow.com/a/990575/14122 是另一个正确的变体(很遗憾,对于一个其他主题问题有这么多不好的答案)。
  • 谢谢@EdMorton,这是我一直在寻找的答案。这意味着我无法使用它,因为我无法控制用户拥有的 awk 版本。

标签: shell variables awk


【解决方案1】:

尽管这被称为 dup 并且那些其他类似的问题确实解决了您的部分问题(如何在 awk 脚本中访问 shell 变量值),但您收到特定错误消息的真正原因awk: syntax error near line 1 awk: bailing out near line 1是您使用的是旧的、损坏的 awk(Solaris 上的 usr/bin/awk),它会为大多数 awk 脚本(无论是否有效)生成该错误消息。尽可能使用 GNU awk,否则在 Solaris 上使用 /usr/xpg4/bin/awk(或 nawk,但与 POSIX 不兼容)。

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

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

或:

if [ ! awk -v x=y '1' /dev/null >/dev/null 2>&1 ]
then
    AWK=$(which awk | tail -1)
else
    AWK=$(which awk)
fi
$AWK -v x=y 'script' file

或其他测试 PATH 中第一个 awk 的东西是旧的、损坏的 awk,如果是,则将其跳过到不同的 awk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多