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

Aar*_*lla 31 awk

这个答案中,

awk '$2=="no"{$3="N/A"}1' file
Run Code Online (Sandbox Code Playgroud)

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

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

我很困惑.这是如何运作的?

jks*_*hah 34

awk,

由于1始终求值为true,因此它执行默认操作{print $0},因此会打印存储的当前行$0

所以,awk '$2=="no"{$3="N/A"}1' file相当于和简写

awk '$2=="no"{$3="N/A"} {print $0}' file
Run Code Online (Sandbox Code Playgroud)

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

awk '$2=="no"{$3="N/A"} {print}' file
Run Code Online (Sandbox Code Playgroud)

事实上,您也可以使用任何非零数字或任何总是求值为1的条件代替1


x-y*_*uri 8

文件

在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
Run Code Online (Sandbox Code Playgroud)

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