为什么awk中的“1”打印当前行?

时间:2013-11-28 09:57:47

标签: awk

this answer

awk '$2=="no"{$3="N/A"}1' file

被接受了。请注意AWK脚本末尾的1。在评论中,答案的作者说

  

[1]是显示当前行的神秘方式。

我很困惑。这有什么作用?

4 个答案:

答案 0 :(得分:31)

awk

由于1始终评估为 true ,因此会执行默认操作{print $0},因此会打印存储在$0

中的当前行

因此,awk '$2=="no"{$3="N/A"}1' file相当于

的简写
awk '$2=="no"{$3="N/A"} {print $0}' file

再次$0 print 的默认参数,所以你也可以写

awk '$2=="no"{$3="N/A"} {print}' file

实际上你也可以使用任何非零数字或任何总是评估为 true 的条件来代替 1

答案 1 :(得分:8)

文档says

  

在awk规则中,可以省略模式或操作,但不能同时省略。如果省略模式,则对每个输入行执行操作。如果省略该操作,则默认操作是打印与该模式匹配的所有行。

因此,它将1视为没有操作的模式。默认操作是打印该行。

即使您有一些规则,例如

awk '
    in_net {
        if (/^\s+bindIp:/) {
            print "  bindIp: 0.0.0.0"
            next
        } else if (/^\s*(#.*)?$/) {
            in_net = 0
        }
    }
    /^net:/ {
        in_net = 1
    }
    1
' /etc/mongod.conf

您仍然需要1,因为只有在遇到没有操作的规则时才会触发默认操作。

答案 2 :(得分:2)

AWK适用于条件方法,然后是动作。因此,如果任何条件为TRUE,那么我们提到的任何行动都将被执行。

如果是1,则意味着我们将该条件设置为TRUE,在这种情况下,我们没有提及任何要执行的操作,因此默认情况下会发生awk print

所以这就是我们在快捷方式中写1的原因。

答案 3 :(得分:0)

我想我会添加一个答案来解释这个简写如何在 POSIX specification for awk 方面工作:

基本描述

<块引用>

awk 程序由以下形式的对组成:

<块引用>
pattern { action }

缺少操作

<块引用>

模式或动作(包括括号括起来的字符)都可以省略。 缺失模式应匹配任何输入记录,缺失动作应等效于:

<块引用>
{ print }

模式说明

<块引用>

模式是任何有效的表达式

表达模式的描述

<块引用>

一个表达式模式应该被评估,就好像它是一个表达式中的一个 布尔上下文。如果结果为真,则该模式应被视为 匹配,并执行相关的动作(如果有)。

布尔上下文

<块引用>

在布尔上下文中使用表达式时,如果它具有数值, 零值应被视为假,任何其他值应被视为 视为真实。否则,空字符串的字符串值应为 视为假,任何其他值都应视为真。


awk '$2=="no"{$3="N/A"}1' 的例子中,第一个 pairpattern$2=="no" 和相应的 action $3="N/A"。这将 1 本身作为下一个“对”(没有相应操作的模式)。

代替1,这个单独的表达式模式可以是任何数值或非空字符串,例如,

awk 9999
awk '"string"'

awk 1 简写在交互式 shell 中输入单行字符时很好。另一方面,在编写脚本时,我更喜欢使用更显式的 awk '{ print }' 使我的代码对其他人更具可维护性和可读性。