为什么'-1'在Awk中不起作用但'(-1)'不起作用?

时间:2018-05-17 08:16:17

标签: awk gnu gawk

我正在做一些数据过滤,发现有点奇怪。

众所周知,awk '1'awk '{print $0}'的缩写,因为1计算为True并触发对Awk的默认操作,其中包括打印当前记录。

同样,awk '0'不会打印任何内容,因为它的计算结果为False。

$ seq 3 | awk '0'
                      # nothing
$ seq 3 | awk '1'
1
2                     # everything
3

所以我尝试了不同的方法并注意到awk '-1'给出了错误,而awk '(-1)'没有问题:

$ seq 3 | awk '-1'
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:      GNU long options: (standard)
...
        # all the gawk explanation on how to use it
...
$ seq 3 | awk '(-1)'
1
2                     # everything, since apparently
3                     # -1 evaluates to True

awk '-NF'awk '-NR'相同或以否定字符开头的任何其他表达式。

为什么会这样?

我使用的是GNU Awk 4.1.65,API:2.0。

1 个答案:

答案 0 :(得分:3)

seq 3 | awk '-1'

相同
seq 3 | awk -1

单引号或双引号可用于根据需要在命令行上构造一个参数,例如:

$ echo 'foo baz' | grep 'foo b'
foo baz
$ echo 'foo baz' | grep foo\ b
foo baz

$ echo 'foo:baz:123' | awk '-F:' '{print $1}'
foo
$ f='-F:'; echo 'foo:baz:123' | awk "$f" '{print $1}'
foo
$ var='$1'; echo 'foo:baz:123' | awk '-F:' "{print $var}"
foo

回到awk -1-1被视为一个选项(因为选项以---开头,具体取决于工具)。 -1不是有效选项,因此我们收到错误

大多数工具都针对此类情况采用解决方法,使用--表示无其他选项

$ seq 3 | awk -- -1
1
2
3

更多例子:

$ # echo is fine with echoing non-options starting with -
$ echo '-1'
-1
$ echo '-1' | grep '-1'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
$ echo '-1' | grep -- '-1'
-1

$ echo 'Foo' | grep 'foo'
$ # using option at end depends on tool, I think it is GNU specific
$ echo 'Foo' | grep 'foo' -i
Foo
$ echo 'Foo' | grep -- 'foo' -i
grep: -i: No such file or directory

进一步阅读:Difference between terms: "option", "argument", and "parameter"?