【问题标题】:awk parse error on '<' operator'<' 运算符上的 awk 解析错误
【发布时间】:2010-11-06 04:55:25
【问题描述】:

我正在尝试在 .alias 文件中为 tcsh 创建一个别名。 别名是这样的:

alias do "grep -iE '<pattern>' <file> | awk '{if($2 < 0)print}'"

当我尝试运行别名时,它给了我以下错误:

awk: cmd. line:1: {if( < 0.0) print}
awk: cmd. line:1:      ^ parse error

知道为什么会发生这种情况吗? 谢谢。

【问题讨论】:

    标签: awk parse-error


    【解决方案1】:

    试试这个。您需要对单引号进行转义,并且不要使用任何双引号。

    alias do 'grep -iE '\''pattern'\'' filename | awk '\''{if ( $2 < 0 ) print}'\'''
    

    【讨论】:

    • @zobars:“接受”最适合您的答案通常被认为是礼貌的。并投票赞成。
    • @JUST,我和你在一起......对不起,我是新来的,所以我花了一段时间才弄清楚如何接受答案,我试过但没有足够的声誉还没有投票。
    • 啊,没注意到无法投票的问题。对不起。
    【解决方案2】:

    好吧,从你提供的命令行开始就是胡言乱语:

    $ alias do "grep -iE '' | awk '{if($2 < 0)print}'"
    bash: alias: do: not found
    bash: alias: grep -iE '' | awk '{if( < 0)print}': not found
    

    如果我将其纠正为我认为您的意思,我会看到:

    $ alias do="grep -iE '' | awk '{if($2 < 0)print}'"
    $ alias do
    alias do='grep -iE '\'''\'' | awk '\''{if( < 0)print}'\'''
    

    通过这个我们可以看到为什么你会得到一个解析错误。 2 美元在awk 看到它之前就被壳吃掉了。试试这个:

    $ alias do="grep -iE '' | awk '{if(\$2 < 0)print}'"
    $ alias do
    alias do='grep -iE '\'''\'' | awk '\''{if($2 < 0)print}'\'''
    

    我的猜测是,此时您将不会再收到解析错误。 (剩下的我自然不能说,因为我不知道你用什么作为输入。)

    【讨论】:

    • 感谢您的回答。是的,我已经编造出来了,因为真实的例子真的很长。问题是我尝试按照您的建议转义 $2,但它仍然被 shell 吃掉......问题在于 $2,我只是尝试将 if($2
    • = 是 Bash(和 Bourne 系列)语法,您的某些引用可能取决于这些 shell 的特性。 OP 使用的是tcsh,它可能有稍微不同的引用规则(并且在定义别名时不使用=
    • @Dennis:啊!一开始我没有抓住tcsh 的东西。我很抱歉。 @zobars:无论是什么问题,都与你的shell 的引用规则有关。如果tcsh 允许您像bash 那样查看文字存储值,请查看tcsh 实际上认为别名是什么。
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2020-02-21
    • 2017-07-22
    • 2020-06-18
    • 1970-01-01
    • 2011-09-10
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多