awk:gawk,mawk,nawk 介绍笔记221108

发布于:2022-11-09 ⋅ 阅读:(1216) ⋅ 点赞:(1)

AWK介绍

简介:
AWK是一种解释性编程语言,主要用于文本处理。之所以叫AWK是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan 的 Family Name 的首字符。

GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为GNU AWK。

AWK的几个实现:

  1. AWK:原先来源于AT&T实验室的的AWK;
    AT&T(American Telephone & Telegraph的缩写 是一家美国电信公司)
  2. NAWK:AT&T实验室的AWK的升级版;
  3. GAWK:这就是GNU AWK;
  4. MAWK:一种轻巧快速的AWK实现。

AWK介绍1

各种AWK版本

当前使用的AWK有三个主要版本,并且它们都符合POSIX标准(至少对于绝大多数用例而言,足够接近)。

  • 第一个是经典awk,它是 Aho,Weinberger , Kernighan (3个人) 在他们的《 AWK编程语言》一书中描述的AWK版本。有时称为 “新AWK”(nawk)或 “一个真正的AWK”,现在托管在GitHub上。这是许多基于BSD的系统(包括macOS)上预先安装的版本(尽管macOS随附的版本已过时,需要升级)。

  • 第二个是GNU Awk(gawk),它是迄今为止功能最强大,维护最活跃的版本。Gawk通常预先安装在Linux系统上,并且通常是默认的awk。使用Homebrew可以很容易地在macOS上安装,Gawk还提供Windows二进制文件。自1994年以来,Arnold Robbins一直是gawk的主要维护者,并继续推广该语言(他还为经典的awk版本做出了许多修复)。Gawk具有awk或POSIX标准中未提供的许多功能,包括新函数,联网功能,C扩展API,事件探查器和调试器以及最近的名称空间。

  • 第三个通用版本是mawk,由Michael Brennan编写。它是Ubuntu和Debian Linux上的默认awk,并且仍然是AWK的最快版本,具有字节码编译器和更节省内存的值表示形式。(从4.0开始,Gawk也使用了字节码编译器,因此它现在已经接近mawk的速度。)

如果你想将AWK用于单行和基本文本处理,则上述任何方法都是不错的选择。如果你打算将其用于较大的脚本或程序,Gawk的功能使其成为明智的选择。

AWK的其他几种实现也具有不同的成熟度和维护级别。值得注意的有这些:嵌入式Linux环境中使用的尺寸优化的BusyBox版本,支持运行时访问Java语言的Java版以及我自己用Go编写的GoAWK(与POSIX兼容的版本)。三个主要的AWK和BusyBox版本都用C编写。


AWK是否仍然有意义?

AWK是否仍然有用这个问题,就像在问空气是否有用一样:你可能看不到它,但周围无处不在。许多Linux管理员和DevOps工程师使用它来转换数据或通过日志文件诊断问题。几乎所有基于Unix的计算机上都安装了AWK版本。除了临时使用外,许多大型开源项目还在其构建或文档工具中使用AWK。仅举几个例子:Linux内核在x86工具中使用它来检查 和重新格式化 objdump文件,Neovim使用它来生成文档,而FFmpeg使用它来进行构建和测试。

即使人们不再想看到AWK,AWK构建脚本也很难被杀死:2018年,LWN 写了一篇文章,是关于GCC贡献者想要用Python替换AWK脚本来生成其选项解析代码。这个建议在当时有一些支持,但显然没有人主动要求做实际的移植,现在AWK脚本依然存在。

Robbins在他的2018年论文中主张将AWK(特别是gawk)用作“系统编程语言”,在这种情况下,其含义是用于编写较大的工具和程序的语言。他概述了他认为尚未流行的原因,但Kernighan“ 并非100%确信 ”缺乏扩展机制是AWK不被大型程序广泛使用的主要原因。他建议,这可能是由于缺乏对访问系统调用等内容的内置支持。但是,这些都没有阻止几个人开发更大的工具:Robbins自己编写的TexiWeb Jr.识字编程工具(1300行AWK),Werner Stoop的d.awk工具用于从源码中备注的MarkDown生成文档, Translate Shell是一个6000行AWK工具,可为基于云的翻译API提供相当强大的命令行界面。

过去几年中,有几位开发人员写过关于在其“大数据”工具包中使用AWK的信息,它比重型分布式计算系统(如Spark和Hadoop)简单得多(有时更快)。Nick Strayer 撰写了 有关使用AWK和R解析多个内核中25 TB数据的文章。其他大数据示例包括Adam Drake 写的标题颇为诱人的文章:“命令行工具可以比Hadoop集群快235倍”,以及Brendan O’Connor的“ 不要使用MAWK,AWK是最快,最优雅的大数据处理语言”。

命令行工具可以比Hadoop集群快235倍 ???

总而言之,在临时文本修改,构建工具,“系统编程”和大数据处理之间(更不用说文本模式的第一人称射击游戏),AWK似乎在2020年还活得很好。



AWK介绍2

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出(即管道)。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

awk的处理文本和数据的方式是这 样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),即默认处理动作是print;如果没有指定模式,则所有被操作所指定的行都被处理,即默认指定模式是全部。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。

像shell一样,awk也有好几种,常见的如awk、nawk、mawk、gawk,其中
awk:最初在1 9 7 7年完成,1 9 8 5年发表了一个新版本的awk,它的功能比旧版本增强了不少,awk 能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理,如果使用C 或P a s c a l 等语言编写程序完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大;

nawk: 在 20 世纪 80 年代中期,对 awk语言进行了更新,并不同程度地使用一种称为 nawk(new awk) 的增强版本对其进行了替换。许多系统中仍然存在着旧的awk 解释器,但通常将其安装为 oawk (old awk) 命令,而 nawk 解释器则安装为主要的 awk 命令,也可以使用 nawk 命令。Dr. Kernighan 仍然在对 nawk 进行维护,与 gawk 一样,它也是开放源代码的,并且可以免费获得;

mawk:mawk 是 awk 编程语言的解释器。awk语言在多媒体数据文件以及文本的检索和处理,算法的原型设计和试验都有广泛的使用。mawk带给awk新的概念,它实现了在《The AWK Programming Language》(Aho, Kernighan and Weinberger, The AWK Programming Language, Addison-Wesley Publishing, 1988.被认为是 AWK 手册。)中定义的 awk语言。mawk遵循 POSIX 1003.2 (草案 11.3)定义的 AWK 语言,包含了一些没有在AWK 手册中提到的特色,同时 mawk 提供一小部分扩展,另外据说mawk是实现最快的awk;

gawk: 是 GNU Project 的awk解释器的开放源代码实现。尽管早期的 GAWK 发行版是旧的 AWK 的替代程序,但不断地对其进行了更新,以包含 NAWK 的特性;
目前,大家都比较倾向于使用awk和gawk。Ubuntu系统中的各种awk的选项设置,可以通过sudo update-alternatives --config awk来完成,实际上你通过手动修改软链接也能实现。Debian最小化安装的时候awk的链接是指向mawk的。

sudo update-alternatives --config awk

GAWK gawk 5 新特性

GNU Awk 5.0.0 发布了,Awk(Gawk)是一种编程语言,用于在 Linux/unix 下对文本和数据进行处理。数据可以来自标准输入、文件或其它命令的输出。它支持用户自定义函数和动态正则表达式等功能。

这是一个重要的新版本,带来了一些新功能和功能改进,最大的亮点是实现了命名空间。相比 4.2.1,变化包括:

  • 添加了对 POSIX 标准 %a 和 %A 输出格式的支持。
  • 测试基础结构得到了极大的改进,简化了 test/Makefile.am 的内容,并且可以从 test/Makefile.in 生成 pc/Makefile.tst。
  • 正则表达式例程已经被 GNULIB 中的例程取代。
  • 基础设施升级:Bison 3.3、Automake 1.16.1、Gettext 0.19.8.1、makeinfo 6.5。
  • 删除了未记录的配置选项和允许在标识符中使用非英语“字母”的代码。
  • 删除了 `–with-whiny-user-strftime’ 配置选项现在已经消失。
  • 更好地适应 C99 环境。
  • PROCINFO[“platform”] 产生一个字符串,表示编译 gawk 的平台。
  • 写入不是变量名的 SYMTAB 元素现在会导致致命错误。
  • pretty-printer 中的注释处理几乎完全从头开始重新设计,以往无法支持的许多极端情况中的注释现在可以格式化中输出。
  • 已经实现命名空间。命令行程序段现在必须都是自包含的句法单元,比如现在不能这么写:gawk -e ‘BEGIN {’ -e ‘print “hello” }’
  • 现在使用语言环境设置来忽略单字节语言环境中的大小写,而不是使用 Latin-1 中的硬连线法。
  • 修复了一些 bug,包括特别重要的 bug。



awk 执行流程图

Created with Raphaël 2.3.0 执行 AWK 的 BEGIN{}语句块 的命令 从 输入流(开头管道或末尾文件) 读取一行 用表达式筛选该行, 执行表达式语句块的命令 例1{print} , 例2/pattern/{print "hello"} , 例3 $n!~/pattern/{代码} 是否读取完最后一行 执行 AWK 的 END{}语句块 的命令 yes no

请添加图片描述

没有读取完
执行AWK的 BEGIN语句块 的命令
从 输入流 读取一行
用表达式筛选该行,
执行表达式语句块块的命令
是否读取完最后一行
执行AWK的 END语句块 的命令

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到