为什么 awk 在非空字符串和正数上打印

Pet*_*r.O 1 awk portability

我注意到一些awk使用1而不是print打印的示例$0(例如。为了节省空间,我通常使用 '1'。在本网站上)。

这是记录在案/安全的做法,还是在某些版本中会受到破坏?过去、现在还是未来?

这里有些例子:

echo 'a-does-print-$0' | awk '"x"'    
echo 'b-does-print-$0' | awk '$0'   
echo 'c-does-print-$0' | awk '1'
echo 'd-does-print-$0' | awk '(1-2)'  
echo 'd-does-print-$0' | awk '{$0="abc"}1'  

echo 'nothing-prints' | awk '{$0="abc"}'  
echo 'nothing-prints' | awk '$999' 
echo 'nothing-prints' | awk '(1-1)'  
echo 'nothing-prints' | awk '1-1' 
echo 'nothing-prints' | awk '0' 
echo 'nothing-prints' | awk 'unsetVar' 
echo 'nothing-printw' | awk ''

echo 'crashes' | awk '-3.14159'
echo 'crashes' | awk '-2' 
echo 'crashes' | awk '-1'
Run Code Online (Sandbox Code Playgroud)

lar*_*sks 7

所以...awk程序的格式是一系列的EXPRESSION { ACTION }语句。如果省略该ACTION部分,则它假定为 print,如果省略EXPRESSION,则它匹配所有内容。所以这会打印所有内容:

awk 1
Run Code Online (Sandbox Code Playgroud)

因为您的表达式 ( 1) 评估为“真”(并且您没有任何操作)。对于所有“x-does-print”示例都是如此,因为给定您的示例输入,它们都具有非零、非空EXPRESSION和 no ACTION。给定一个空的输入行,$0在第二个例子中不会输出任何东西。

同样,除了第一个示例之外,您的“无打印”示例有一个计算结果为“false”(空字符串或数字 0)的表达式。该{$0="abc"}示例的工作方式不同:它不打印任何内容,因为它没有任何打印指令。给定至少有 999 个字段的长输入行,第二个示例 ( $999) 实际上会打印出该行。

这是awk运作方式的基础。可以肯定的是,它已记录在案,并且不会中断。

请注意,您的“崩溃”示例实际上并未崩溃;您刚刚在 shell 语法中犯了一个基本错误。awk 将参数以-命令行选项开头。引用它们不会改变任何事情。如果你想像这样传递 awk 负数,你需要在你的 awk 程序前面加上前缀--以指示 awk 它应该停止处理选项:

echo 'crashes' | awk -- -3.14159
Run Code Online (Sandbox Code Playgroud)

将打印“崩溃”,因为-3.14150既不是空字符串也不是数字 0。