为什么 '-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
进一步阅读:
我正在做一些数据过滤,发现有些奇怪。
众所周知,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
进一步阅读: