如何利用 awk 的特殊模式 BEGIN 和 END 进行处理

在 awk 系列的第八节,我们介绍了一些强大的 awk 命令功能,它们是变量、数字表达式和赋值运算符。

本节我们将学习更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END 。

随着我们逐渐展开,并探索出更多构建复杂 awk 操作的方法,将会证明 awk 的这些特殊功能的是多么强大。

开始前,先让我们回顾一下 awk 系列的介绍,记得当我们开始这个系列时,我就指出 awk 指令的通用语法是这样的:

# awk 'script' filenames  

登录后复制

在上述语法中,awk 脚本拥有这样的形式:

/pattern/ { actions } 

登录后复制

你通常会发现脚本中的模式(/pattern )是一个正则表达式,此外,你也可以在这里用特殊模式 BENGIN 和 END 。因此,我们也能按照下面的形式编写一条 awk 命令:

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

登录后复制

假如你在 awk 脚本中使用了特殊模式:BEGIN 和 END ,以下则是它们对应的含义:

BEGIN 模式:是指 awk 将在读取任何输入行之前立即执行BEGIN 中指定的动作。END 模式:是指 awk 将在它正式退出前执行 END中指定的动作。

含有这些特殊模式的 awk 命令脚本的执行流程如下:

当在脚本中使用了 BEGIN 模式,则 BEGIN 中所有的动作都会在读取任何输入行之前执行。然后,读入一个输入行并解析成不同的段。接下来,每一条指定的非特殊模式都会和输入行进行比较匹配,当匹配成功后,就会执行模式对应的动作。对所有你指定的模式重复此执行该步骤。再接下来,对于所有输入行重复执行步骤 2 和 步骤 3。当读取并处理完所有输入行后,假如你指定了 END 模式,那么将会执行相应的动作。

当你使用特殊模式时,想要在 awk 操作中获得最好的结果,你应当记住上面的执行顺序。

为了便于理解,让我们使用第八节的例子进行演示,那个例子是关于 Tecmint 拥有的域名列表,并保存在一个叫做 domains.txt 的文件中。

news.tecmint.comtecmint.comlinuxsay.comwindows.tecmint.comtecmint.comnews.tecmint.comtecmint.comlinuxsay.comtecmint.comnews.tecmint.comtecmint.comlinuxsay.comwindows.tecmint.comtecmint.com

登录后复制

$ cat ~/domains.txt

登录后复制

如何使用 awk 的特殊模式 BEGIN 与 END

查看文件内容

在这个例子中,我们希望统计出 domains.txt 文件中域名tecmint.com 出现的次数。所以,我们编写了一个简单的 shell 脚本帮助我们完成任务,它使用了变量、数学表达式和赋值运算符的思想,脚本内容如下:

#!/bin/bashfor file in $@; doif [ -f $file ] ; then### 输出文件名echo "File is: $file"### 输出一个递增的数字记录包含 tecmint.com 的行数awk '/^tecmint.com/ { counter+=1 ; printf "%s/n", counter ; }' $fileelse### 若输入不是文件,则输出错误信息echo "$file 不是一个文件,请指定一个文件。" >&2 && exit 1fidone### 成功执行后使用退出代码 0 终止脚本exit 0

登录后复制

现在让我们像下面这样在上述脚本的 awk 命令中应用这两个特殊模式:BEGIN 和 END :

我们应当把脚本:

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

登录后复制

改成:

awk ' BEGIN {  print "文件中出现 tecmint.com 的次数是:" ; }/^tecmint.com/ {  counter+=1  ;  }END {  printf "%s/n",  counter  ; } '  $file

登录后复制

在修改了 awk 命令之后,现在完整的 shell 脚本就像下面这样:

#!/bin/bashfor file in $@; doif [ -f $file ] ; then### 输出文件名echo "File is: $file"### 输出文件中 tecmint.com 出现的总次数awk ' BEGIN {  print "文件中出现 tecmint.com 的次数是:" ; }/^tecmint.com/ {  counter+=1  ;  }END {  printf "%s/n",  counter  ; } '  $fileelse### 若输入不是文件,则输出错误信息echo "$file 不是一个文件,请指定一个文件。" >&2 && exit 1fidone### 成功执行后使用退出代码 0 终止脚本exit 0

登录后复制

如何使用 awk 的特殊模式 BEGIN 与 END

awk 模式 BEGIN 和 END

当我们运行上面的脚本时,它会首先输出 domains.txt 文件的位置,然后执行 awk 命令脚本,该命令脚本中的特殊模式 BEGIN 将会在从文件读取任何行之前帮助我们输出这样的消息“文件中出现 tecmint.com 的次数是: ”。

接下来,我们的模式/^tecmint.com/ 会在每个输入行中进行比较,对应的动作{ counter+=1 ; } 会在每个匹配成功的行上执行,它会统计出 tecmint.com 在文件中出现的次数。

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

$ ./script.sh ~/domains.txt 

登录后复制

如何使用 awk 的特殊模式 BEGIN 与 END

用于统计字符串出现次数的脚本

最后总结一下,我们在本节中演示了更多的 awk 功能,并学习了特殊模式 BEGIN 和 END 的概念。

正如我之前所言,这些 awk 功能将会帮助我们构建出更复杂的文本过滤操作。第十节将会给出更多的 awk 功能,我们将会学习 awk 内置变量的思想,所以,请继续保持关注。

以上就是如何利用 awk 的特殊模式 BEGIN 和 END 进行处理的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3046056.html

(0)
上一篇 2025年3月13日 16:43:23
下一篇 2025年3月13日 16:43:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入解析semanage命令的用法

    导读semanage命令是用来查询与修改SELinux默认目录的安全上下文。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。下面让我们详细…

    编程技术 2025年3月13日
    000
  • Vim 快捷键大全

    Vim 编辑器是一个基于命令行的工具,是传奇编辑器 vi 的增强版。尽管图形界面的富文本编辑有很多,但是熟悉 Vim 对于每一位 Linux 的使用者都能有所帮助——无论你是经验丰富的系统管理员,还是刚上手树莓派的新手用户。 这个轻量级的编…

    2025年3月13日 编程技术
    200
  • 学习在Linux系统中使用sed命令替换特定行数据的技巧

    linux中sed命令功能强大,今天我们就来详细介绍如何在linux中使用sed命令进行替换,具体来说分为以下几种情况: 1)如何替换第一次搜索到的内容; 2)如何在全文中替换所有能匹配的内容; 3)如何替换某一行的内容; 4)如何替换多行…

    2025年3月13日 编程技术
    200
  • Linux 文件操作指南:分割与重组文件的技巧

    导读Linux 有几个用于分割文件的工具程序。那么你为什么要分割文件呢?一个用例是将大文件分割成更小的尺寸,以便它适用于比较小的存储介质,比如 U 盘。当您遇到 FAT32(最大文件大小为 4GB),且您的文件大于此时,通过 U 盘传输文件…

    编程技术 2025年3月13日
    200
  • Linux中如何查看文件的尾部行数

    在Linux系统中,有多种方法可以查看一个文件的末尾几行,下面将介绍几种常用的方法,并给出具体的代码示例。 方法一:使用tail命令 tail命令是一个非常方便的工具,能够显示文件的末尾内容,通过加上-n参数可以指定显示几行内容。以下是示例…

    2025年3月13日
    200
  • Linux删除文件尾部数据的实用方法

    标题:Linux删除文件尾部数据的实用方法 在Linux系统中,经常会遇到需要删除文件尾部数据的情况,特别是当文件中存在一些无效或不需要的数据时。本文将介绍几种实用的方法来删除文件尾部数据,同时提供具体的代码示例帮助读者快速实施。 方法一:…

    2025年3月13日
    200
  • Linux文件操作技巧:删除末尾多行内容

    当使用Linux操作系统进行文件处理时,经常会遇到需要删除文件末尾的多行内容的情况。这种操作通常可以通过一些简单的命令来实现,下面将介绍一些常用的Linux文件操作技巧,并提供具体的代码示例。 使用sed命令删除末尾多行内容: sed命令是…

    2025年3月13日
    200
  • sublime怎么用input

    Sublime Text 中使用输入功能可提高编码效率。具体步骤包括:1. 打开文件;2. 输入文本或代码;3. 按 Ctrl/Cmd + Enter 完成当前行;4. 重复以完成文件。其他选项包括:5. 自动完成;6. 语法高亮;7. 代…

    2025年3月13日
    200
  • sublimegdb怎么配置

    配置 SublimeGDB 涉及六个步骤:安装 SublimeGDB 包,安装 GNU 调试器 (GDB),配置 SublimeGDB 设置,配置构建系统,设置断点,启动调试会话。 SublimeGDB 的配置 如何在 Sublime Te…

    2025年3月13日
    200
  • sublime怎么跳转

    Sublime Text 快速跳转至特定位置的方法:行号跳转:快捷键⌘+G/Ctrl+G文件符号跳转:快捷键⌘+R/Ctrl+R搜索文本:快捷键⌘+F/Ctrl+F项目跳转:双击文件/文件夹最近文件:快捷键⌘+O/Ctrl+O错误/警告跳转…

    2025年3月13日
    200

发表回复

登录后才能评论