我已经阅读了几个awk教程并在这里看到了一些问题和答案,而问题就是我看到人们如何使用他们的awk 1-liners和它在我的脑海里真的过于复杂。
所以我看到这样的事情:
awk '/pattern/ { print }'
awk '/pattern/ { print $0 }'
awk '/pattern/ { print($0) }'
awk '/pattern/ { print($0); }'
awk 'BEGIN { print }'
awk '/pattern/ BEGIN { print };
有时候我会收到错误,有时候却没有,但是因为我看到了很多不同的措辞,我在修复语法错误时遇到了麻烦,因为我无法弄清楚允许的内容和不允许的内容。
有人可以解释一下吗?打印是否需要parens?是否需要分号? BEGIN是否需要?使用/ pattern /启动awk脚本时会发生什么,和/或只是将print
这样的函数的名称传递给它?
答案 0 :(得分:4)
一次一个:
是
print
与return
一样,是内置函数,而不是函数,因此根本不使用parens。当您看到print("foo")
parens与字符串"foo"
相关联时,它们不会以print
命令的任何方式成为其中的一部分,尽管它看起来如何。将它写成print ("foo")
可能更清楚(但在这种情况下仍然没用)。
不是当陈述在单独的行上时。与shell类似,需要使用分号来分隔单行上的语句
没有。请注意,BEGIN
是一个关键字,表示在打开第一个输入文件进行读取之前存在的条件,因此BEGIN{print}
将只打印一个空白行,因为没有读取任何内容进行打印。另外/pattern/ BEGIN
是无意义的,应该会产生语法错误。
awk脚本由condition { <action> }
个部分组成,默认条件为TRUE,默认操作为print $0
。因此awk '/pattern/'
表示if the regexp "pattern" exists in the current record then invoke the default action which is to print that record
,awk '{ print }'
表示the default condition of TRUE applies so execute the specified action and print the current record
。也不是print
默认打印当前记录,因此print $0
只与print
同义。
如果您正在考虑开始使用awk,请阅读Arnold Robbins的书“Effective Awk Programming”,至少阅读第一章或第2章。
答案 1 :(得分:2)
函数调用需要()
。声明没有(但似乎允许它们)。
print和printf是语句,所以不需要()
(但支持它&#34;整个项目列表可以选择括在括号中。&#34;)
从print我们也发现了
没有项目的简单语句'print'相当于'print $ 0':它打印整个当前记录。
所以我们现在知道前三个陈述是相同的。
从Actions我们发现了。
一个动作由一个或多个awk语句组成,用大括号括起来('{...}')。
那个
语句由换行符或分号分隔。
它告诉我们分号是&#34;分隔符&#34;而不是终结者,所以我们在行动结束时不需要一个,所以我们现在知道第四个也是相同的。
BEGIN
是special pattern,
[a] BEGIN规则仅在读取第一个输入记录之前执行一次。
所以第五个是不同的,因为它在开始时而不是在每一行上运行一次。
最后一个是语法错误,因为它有两个彼此相邻的模式,没有干预动作或分隔符。
答案 2 :(得分:0)
所有这些awk命令(最后2个除外)都可以缩短为:
awk '/pattern/' file
因为print
始终是awk
中的操作。
分号在}
之前是可选的。
您无法在BEGIN
/pattern/