我注意到一些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)
所以...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。
归档时间: |
|
查看次数: |
610 次 |
最近记录: |