在第8部分 中,我们介绍了一些强大的awk命令的功能,也就是变数,数字表达式和赋值操作符 。
正如我们前进,在这一领域,我们将覆盖更多的awk的功能,那就是特殊的模式: BEGIN
和END
。
了解Awk模式BEGIN和END
当我们试图扩大,并探索构建复杂awk的操作的更多方法,这些特殊功能将证明是有益的。
要开始,让我们推动我们的思绪回到引入awk的系列,记得当我们开始这个系列中,我指出,运行awk命令的一般语法是:
# awk 'script' filenames
而在上面的语法中,awk脚本的形式为:
/pattern/ { actions }
当你考虑脚本的格局,这通常是一个正则表达式,另外,你也可以认为模式的特殊模式BEGIN
和END
。 因此,我们也可以写在下面形式的awk命令:
awk ' BEGIN { actions } /pattern/ { actions } /pattern/ { actions } ………. END { actions } ' filenames
在您使用特殊模式的事件: BEGIN
和END
在awk脚本,这是他们每个人是指:
- BEGIN模式 :是指awk将执行指定在读取任何输入线之前就开始一次行动(S)。
- END模式 :也就是说它实际上退出前awk将执行在END指定的操作(S)。
并且含有这些特殊模式的一个AWK命令脚本的执行的流程如下:
- 当
BEGIN
模式在脚本中使用,所有动作开始读取任何输入行之前执行一次。 - 然后读取输入行并解析到不同的字段。
- 接下来,将所指定的每个非特殊模式与用于匹配的输入行进行比较,当找到匹配时,然后执行该模式的动作。 此阶段将针对您指定的所有模式重复。
- 接下来,对于所有输入线重复阶段2和3。
- 当所有的输入线已经读取和处理,如果你指定
END
模式,动作(S)将被执行。
在特殊模式工作,以实现一个AWK操作最好的结果时,你应该永远记住执行这个序列。
要理解这一切,让我们举例说明使用来自例如部分8 ,有关youcl拥有域的列表,存储在一个名为domains.txt文件。
news.youcl.com youcl.com linuxsay.com windows.youcl.com youcl.com news.youcl.com youcl.com linuxsay.com youcl.com news.youcl.com youcl.com linuxsay.com windows.youcl.com youcl.com
$ cat ~/domains.txt
查看文件的内容
在这个例子中,我们要计数的次数域的数目youcl.com
在文件domains.txt列出。 所以我们写了一个小shell脚本来帮助我们使用变量,数字表达式和赋值运算符的想法,它有以下内容:
#!/bin/bash for file in $@; do if [ -f $file ] ; then #print out filename echo "File is: $file" #print a number incrementally for every line containing youcl.com awk '/^youcl.com/ { counter+=1 ; printf "%s\n", counter ; }' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
现在,让我们采用两种特殊模式: BEGIN
和END
上面如下脚本awk命令:
我们将改变脚本:
awk '/^youcl.com/ { counter+=1 ; printf "%s\n", counter ; }' $file
至:
awk ' BEGIN { print "The number of times youcl.com appears in the file is:" ; } /^youcl.com/ { counter+=1 ; } END { printf "%s\n", counter ; } ' $file
作出更改awk命令后,完整的shell脚本现在看起来是这样的:
#!/bin/bash for file in $@; do if [ -f $file ] ; then #print out filename echo "File is: $file" #print the total number of times youcl.com appears in the file awk ' BEGIN { print "The number of times youcl.com appears in the file is:" ; } /^youcl.com/ { counter+=1 ; } END { printf "%s\n", counter ; } ' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
Awk BEGIN和END模式
当我们运行上面的脚本,它会首先打印文件domains.txt的位置,然后awk命令脚本执行,其中BEGIN
特殊模式有助于我们打印出消息“ The number of times youcl.com appears in the file is:
: “从文件读取任何输入行之前。
那么,我们的模式, /^youcl.com/
是对每个输入线和行动相比, { counter+=1 ; }
{ counter+=1 ; }
是对于每个输入线路,该计数的次数执行youcl.com
出现在文件中。
最后, END
图案将打印总域的次数youcl.com
出现在文件中。
$ ./script.sh ~/domains.txt
计数的字符串出现的字符串数
最后,我们通过更多的awk的功能走在探索特殊花纹的概念: BEGIN
和END
。
正如我前面所指出的,这些awk的功能将帮助我们构建更复杂的文本过滤操作 ,还有更多的覆盖下awk的功能,并在第10部分 ,我们将要着手awk中的想法内置变量,所以保持连接。