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

Why does '-1' not work in Awk but '(-1)' does?

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

众所周知,awk '1'awk '{print [=13=]}' 的缩写,因为 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.

seq 3 | awk '-1'

相同
seq 3 | awk -1

single/double 引号可用于根据需要在命令行上构造参数,例如:

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

$ echo 'foo:baz:123' | awk '-F:' '{print }'
foo
$ f='-F:'; echo 'foo:baz:123' | awk "$f" '{print }'
foo
$ var=''; 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

进一步阅读: