Linux|awk 特殊模式“BEGIN 和 END”

devtools/2024/11/14 20:02:50/

引言

本文[1],我们将介绍Awk的更多特性,特别是两个特殊的模式:BEGIN和END。

alt

这些独特的功能在我们努力扩展和深入探索构建复杂Awk操作的多种方法时,将大有裨益。

实例

让我们从Awk系列的开篇回顾开始,回想一下,当我们启动这个系列时,我提到了运行Awk命令的通用语法是这样的:

# awk 'script' filenames  

在上面的语法中,Awk 脚本的形式如下:

/pattern/ { actions } 

在编写脚本时,你可能会用到模式,这通常是正则表达式。同时,你也可以将模式理解为特殊的BEGIN和END模式。基于此,我们可以按照以下形式来编写Awk命令:

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

在Awk脚本中,如果用到了BEGIN和END这两个特殊模式,它们各自代表的含义如下:

BEGIN模式:指的是在读取任何输入行之前,Awk会先执行BEGIN下指定的所有操作一次。 END模式:指的是在Awk程序退出之前,会执行END下指定的所有操作。 含有这些特殊模式的Awk命令脚本的执行顺序大致如下:

当脚本执行到BEGIN模式时,BEGIN下的所有操作会被执行一遍,这发生在读取任何输入行之前。 接着,Awk会读取一行输入并将其分解成不同的字段。 然后,Awk会将指定的非特殊模式与输入行逐一进行匹配,一旦匹配成功,就会执行该模式下的所有操作。这个过程会针对所有已指定的模式重复进行。 对于所有输入行,第二和第三步会重复执行。 处理完所有输入行后,如果脚本中有END模式,那么Awk将执行END下的操作。 在使用特殊模式进行Awk操作时,你应该始终牢记这个执行顺序,以期获得最佳操作效果。

以domains.txt文件中的Tecmint所拥有的域名列表为例:

news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com
$ cat ~/domains.txt
View Contents of File
View Contents of File

以这个示例为例,我们的目标是统计域名 "tecmint.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 tecmint.com 
                awk '/^tecmint.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

接下来,我们将在上述脚本中的Awk命令里应用BEGIN和END这两个特殊模式,具体如下:

我们会对脚本做出如下修改:

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

>

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

执行上述脚本时,它会首先显示文件 "domains.txt" 的位置,随后执行Awk命令脚本。在读取文件中的任何输入行之前,BEGIN特殊模式会先帮助我们输出信息:“域名tecmint.com在文件中出现的次数为:”。

接下来,我们的正则表达式模式 /^tecmint.com/ 将与每一行输入行进行匹配,对于匹配的每一行,将执行操作 { counter+=1 ; },这个操作用于统计域名 "tecmint.com" 在文件中出现的次数。

最终,END模式将输出域名 "tecmint.com" 在文件中出现的总次数。

$ ./script.sh ~/domains.txt 
alt

总结来说,我们通过研究BEGIN和END这两个特殊模式的概念,进一步探索了Awk的更多功能。正如我之前提到的,这些Awk的功能将助力我们构建更为复杂的文本过滤操作。

Reference
[1]

Source: https://www.tecmint.com/learn-use-awk-special-patterns-begin-and-end/

本文由 mdnice 多平台发布


http://www.ppmy.cn/devtools/30773.html

相关文章

【研发日记】Matlab/Simulink避坑指南(十一)——Delay周期Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug》 见《研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记,Matlab/Simulink避坑指…

25计算机考研院校数据分析 | 哈尔滨工业大学

哈尔滨工业大学(Harbin Institute of Technology),简称哈工大, 校本部位于黑龙江省哈尔滨市,是由工业和信息化部直属的全国重点大学,位列国家“双一流”、“985工程”、“211工程”,九校联盟 、…

windows ubuntu sed,awk,grep篇,8,Awk 语法和基础命令

目录 51.Awk 命令语法 52.Awk 程序结构(BEGIN,body,END)区域 53.打印命令 54.模式匹配 Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式,即每行数据包 含多个以分界符分隔的字段时,显得尤其有用。即便是输入文件没有一定的格式&a…

【Flask 系统教程 3】请求与响应

Flask 是一个灵活而强大的 Web 框架,而请求与响应则是构建 Web 应用的核心组成部分。在本文中,我们将探讨 Flask 中请求与响应的各种用法,包括不同的请求方法、重定向、响应对象、获取查询参数以及文件上传等。 请求 在 Flask 中&#xff0…

ue引擎游戏开发笔记(26)——处理角色死亡敌人仍攻击bug

1.需求分析 对游戏中存在的各种小问题做细节处理,例如玩家在死亡后,敌人仍对着目标开炮,并且仍然触发爆炸效果。 2.操作实现 1.首先分析问题起因,是由于虽然玩家控制的小车被摧毁了,但控制器仍然存在,没有…

华为OD机试 - 会议室占用时间段(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

webpack基础---常用loader

webpack 命令式和配置文件 html-webpack-plugin 配置项:{ templete: filename: inject: } 清除上次打包的文件,output: { clear: true } mode选项: none development prodution souce-map:可以精准定位代码行数 { devt…

京东初级运营必修课程,从零开始学习(49节课)

课程内容: 01.1.全面解析店铺后台的各项功能 02.2.商品要素的重要性及如何打造黄金标题 03.3.手把手带你完成商品上架 04.4.为啥你的流量不转化-诸葛 05.5.怎么策划一张高点击率的照片 06.6.内功优化之数据化标题创建 07.7.内功优化之如何高转化活动落地页 …