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

标签 bash awk

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

我认为使用 -F 提供字段分隔符和在 awk 中使用 FS 变量是一回事。

但如果我这样做:

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

由于空操作 ({}),它没有按预期打印任何内容。 而且,如果我写一个脚本:

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

如预期的那样,输出中没有打印任何行。

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

#!/usr/bin/awk -f

FS=":";
{}

它再次打印所有行!

因此,我想在脚本中取消默认打印操作,因为我将在该操作中进行一些计算并稍后在 END 部分中打印结果。如果 awk 不先打印所有行,我该怎么做?

最佳答案

FS=":";

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

赋值是一个表达式,所以 FS=":"是一个表达式,没有对应的 Action 。省略 Action 时,默认为“打印当前记录”。至于{}在下一行,它是一个什么都不做的 Action ,没有条件(这意味着“总是”);什么都不写也有同样的效果。

要在脚本启动时执行代码,您需要一个 BEGIN堵塞。你可以想到BEGIN作为特殊条件,在读取任何输入之前在脚本开头匹配一次。

BEGIN {FS = ":"}

关于bash - 使用 FS 时如何抑制 awk 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141093/

相关文章:

arrays - 合并 JSON 数组

bash - shell_exec 在 php web 应用程序中不工作

awk - 使用 awk 求相似行的总和

Linux 用多列连接多个文件

linux - curl 特定 header 的 "write out"值

java - 处理java包文件夹的简单方法?

bash - 如何使用多个 shebang 解释器运行同一个文件?

github - 将特殊的内联代码样式更改为 Markdown 中的 block 代码样式

python - Linux结合两个不同的文本文件

linux - 显示当前解释器有多少个子进程的命令