我正在做一些数据过滤,发现有点奇怪。
众所周知,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。
答案 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"?