如何在使用FS时抑制awk输出?

时间:2014-04-17 18:48:31

标签: bash awk

在使用通过命令行传递的字段分隔符并在脚本中使用FS=":"时,我无法理解awk的行为差异。

我认为使用-F提供字段分隔符并在awk中使用FS变量是相同的。

但如果我这样做:

awk -F: '{}' /etc/passwd

由于空行动({}),它没有按预期打印任何内容。 而且,如果我加上一个剧本:

#!/usr/bin/awk -f
{}

没有像预期那样在输出上打印任何行。

现在,如果我将字段分隔符放在脚本中,如:

#!/usr/bin/awk -f

FS=":";
{}

它再次打印所有行!

所以,我想在脚本中禁止默认的打印操作,因为我将在操作中进行一些计算,然后在END部分中打印结果。如果不首先打印所有行,我怎么能这样做呢?

2 个答案:

答案 0 :(得分:9)

FS=":";

这条线不能做你想象的那样。这不是一个指令。 Awk并不像大多数解释语言一样工作:文件不是指令列表。在顶层,您有CONDITION ACTION形式的项,其中条件是表达式,该操作是包含语句(指令)的大括号分隔块。对满足条件的每条记录(行)执行操作。条件和操作都是可选的。

赋值是一个表达式,因此FS=":"是一个表达式,并且没有相应的操作。省略该操作时,默认为“打印当前记录”。对于下一行的{},它是一个什么都不做的动作,没有条件(这意味着“总是”);什么都没有写出同样的效果。

要在脚本启动时执行代码,您需要BEGIN块。您可以将BEGIN视为在读取任何输入之前在脚本开头匹配一次的特殊条件。

BEGIN {FS = ":"}

答案 1 :(得分:2)

> /foo/  { }  # match foo, do nothing - empty action
> 
> /foo/       # match foo, print the record - omitted action

here