学习如何使用Awk特殊模式'BEGIN和END' - 第9部分

在本文中,我们将介绍Awk的特殊模式:BEGIN和END,这些特殊功能将有助于扩展和探索更复杂的Awk操作。

在第8部分 本awk的系列中,我们介绍了一些强大的awk命令的功能,也就是变数,数字表达式和赋值操作符

正如我们前进,在这一领域,我们将覆盖更多的awk的功能,那就是特殊的模式: BEGINEND

了解Awk模式BEGIN和END

了解Awk模式BEGIN和END

当我们试图扩大,并探索构建复杂awk的操作的更多方法,这些特殊功能将证明是有益的。

要开始,让我们推动我们的思绪回到引入awk的系列,记得当我们开始这个系列中,我指出,运行awk命令的一般语法是:

# awk 'script' filenames  

而在上面的语法中,awk脚本的形式为:

/pattern/ { actions } 

当你考虑脚本的格局,这通常是一个正则表达式,另外,你也可以认为模式的特殊模式BEGINEND 因此,我们也可以写在下面形式的awk命令:

awk '
BEGIN { actions } 
/pattern/ { actions }
/pattern/ { actions }
……….
END { actions } 
' filenames  

在您使用特殊模式的事件: BEGINENDawk脚本,这是他们每个人是指:

  1. BEGIN模式 :是指awk将执行指定在读取任何输入线之前就开始一次行动(S)。
  2. END模式 :也就是说它实际上退出前awk将执行在END指定的操作(S)。

并且含有这些特殊模式的一个AWK命令脚本的执行的流程如下:

  1. BEGIN模式在脚本中使用,所有动作开始读取任何输入行之前执行一次。
  2. 然后读取输入行并解析到不同的字段。
  3. 接下来,将所指定的每个非特殊模式与用于匹配的输入行进行比较,当找到匹配时,然后执行该模式的动作。 此阶段将针对您指定的所有模式重复。
  4. 接下来,对于所有输入线重复阶段2和3。
  5. 当所有的输入线已经读取和处理,如果你指定END模式,动作(S)将被执行。

在特殊模式工作,以实现一个AWK操作最好的结果时,你应该永远记住执行这个序列。

要理解这一切,让我们举例说明使用来自例如部分8 ,有关Howtoing拥有域的列表,存储在一个名为domains.txt文件。

news.howtoing.com
howtoing.com
linuxsay.com
windows.howtoing.com
howtoing.com
news.howtoing.com
howtoing.com
linuxsay.com
howtoing.com
news.howtoing.com
howtoing.com
linuxsay.com
windows.howtoing.com
howtoing.com
$ cat ~/domains.txt
查看文件的内容

查看文件的内容

在这个例子中,我们要计数的次数域的数目howtoing.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 howtoing.com 
awk '/^howtoing.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

现在,让我们采用两种特殊模式: BEGINEND上面如下脚本awk命令:

我们将改变脚本:

awk '/^howtoing.com/ { counter+=1 ; printf "%s\n", counter ; }' $file

至:

awk ' BEGIN {  print "The number of times howtoing.com appears in the file is:" ; }
/^howtoing.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 howtoing.com appears in the file
awk ' BEGIN {  print "The number of times howtoing.com appears in the file is:" ; }
/^howtoing.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模式

Awk BEGIN和END模式

当我们运行上面的脚本,它会首先打印文件domains.txt的位置,然后awk命令脚本执行,其中BEGIN特殊模式有助于我们打印出消息“ The number of times howtoing.com appears in the file is: : “从文件读取任何输入行之前。

那么,我们的模式, /^howtoing.com/是对每个输入线和行动相比, { counter+=1 ; } { counter+=1 ; }是对于每个输入线路,该计数的次数执行howtoing.com出现在文件中。

最后, END图案将打印总域的次数howtoing.com出现在文件中。

$ ./script.sh ~/domains.txt 
计数的字符串出现的字符串数

计数的字符串出现的字符串数

最后,我们通过更多的awk的功能走在探索特殊花纹的概念: BEGINEND

正如我前面所指出的,这些awk的功能将帮助我们构建更复杂的文本过滤操作 ,还有更多的覆盖下awk的功能,并在第10部分 ,我们将要着手awk中的想法内置变量,所以保持连接。