需要基本命令行awk语法指南

时间:2015-04-17 16:43:54

标签: bash awk

我已经阅读了几个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这样的函数的名称传递给它?

3 个答案:

答案 0 :(得分:4)

一次一个:

  1. 有人可以解释一下吗?
    1. 打印是否需要parens?
    2. printreturn一样,是内置函数,而不是函数,因此根本不使用parens。当您看到print("foo") parens与字符串"foo"相关联时,它们不会以print命令的任何方式成为其中的一部分,尽管它看起来如何。将它写成print ("foo")可能更清楚(但在这种情况下仍然没用)。

      1. 是否需要半冒号?
      2. 不是当陈述在单独的行上时。与shell类似,需要使用分号来分隔单行上的语句

        1. BEGIN是否需要?
        2. 没有。请注意,BEGIN是一个关键字,表示在打开第一个输入文件进行读取之前存在的条件,因此BEGIN{print}将只打印一个空白行,因为没有读取任何内容进行打印。另外/pattern/ BEGIN是无意义的,应该会产生语法错误。

          1. 使用/ pattern /启动awk脚本时会发生什么,和/或只是传递一个像print这样的函数的名称?
          2. 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 recordawk '{ 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)

函数调用需要()。声明没有(但似乎允许它们)。

printprintf是语句,所以不需要()(但支持它&#34;整个项目列表可以选择括在括号中。&#34;)

print我们也发现了

  

没有项目的简单语句'print'相当于'print $ 0':它打印整个当前记录。

所以我们现在知道前三个陈述是相同的。

Actions我们发现了。

  

一个动作由一个或多个awk语句组成,用大括号括起来('{...}')。

那个

  

语句由换行符或分号分隔。

它告诉我们分号是&#34;分隔符&#34;而不是终结者,所以我们在行动结束时不需要一个,所以我们现在知道第四个也是相同的。

BEGINspecial pattern

  

[a] BEGIN规则仅在读取第一个输入记录之前执行一次。

所以第五个是不同的,因为它在开始时而不是在每一行上运行一次。

最后一个是语法错误,因为它有两个彼此相邻的模式,没有干预动作或分隔符。

答案 2 :(得分:0)

所有这些awk命令(最后2个除外)都可以缩短为:

awk '/pattern/' file

因为print始终是awk中的操作。

分号在}之前是可选的。

您无法在BEGIN

之后放置/pattern/