Awk、nawk、gawk和mawk的区别
1.概述
AWK 是一种数据驱动的脚本语言,最初设计用于模式搜索和文本操作。它不需要编译,允许我们使用变量、函数和逻辑运算符。AWK 语言在不同的操作系统上有不同的解释器,例如awk 、nawk 、gawk 和mawk 。
在本教程中,我们将讨论这些解释器以及它们之间的区别。
2. 设置
让我们使用Nano 编辑器创建一个名为employees.txt的示例文件:
$ nano employees.txt
然后我们可以粘贴这些数据:
John Doe 1784 1/22/54 750000
Lucy Kibaki 2054 4/12/54 350000
Fridah Machanja 1004 19/16/54 250000
Robert Edward 1654 7/22/54 650000
我们将在整个教程中使用这个文件来测试awk、nawk、gawk和mawk是如何工作的。
3. awk
** awk的原始版本是 1977 年在 AT&T 贝尔实验室编写的,作为一种模式匹配程序,用于处理具有大量数据的文件,例如数据库文件**。
在某些系统中,它有时被称为原始awk 或旧awk或oawk。
awk实用程序执行使用 AWK 编程语言编写的程序。它专门从事文本数据处理和操作。这使我们能够以扫描特定文本模式的语句的形式编写紧凑但功能强大的程序。** awk解释器在一个或多个文档的每一行中搜索模式,并且我们可以定义一个动作,以便在匹配时执行。**
它将输入数据分组到记录和字段中。然后它一次处理一个记录,直到输入结束。此外,它使用记录分隔符来控制输入数据的拆分方式。默认记录分隔符是换行符,但我们可以使用RS变量更改它。
让我们找到awk的安装目录:
$ which awk
/usr/bin/awk
我们还可以找到可用的版本:
$ awk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2019 Free Software Foundation.
...truncated
我们当前的系统在 Ubuntu Linux 上运行。GNU AWK,也称为gawk,是大多数 Linux 发行版上的默认awk解释器。
在 Linux 系统上,awk和nawk只是gawk解释器的符号链接 ,运行其中任何一个都会得到相同的结果。
使用原始的awk,我们可以执行算术和字符串函数等操作,使用条件和循环等编程概念,并输出格式化的数据报告。awk使我们能够将文本文件视为由字段和记录组成的文本数据库。
原始的awk命令具有以下基本语法:
$ original-awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file... ]
要测试原始的awk命令,我们需要先安装它:
$ sudo apt install original-awk
安装后,我们可以使用original-awk简单地打印employees.txt文件中的所有记录:
$ original-awk '{print}' employees.txt
John Doe 1784 1/22/54 750000
Lucy Kibaki 2054 4/12/54 350000
Fridah Machanja 1004 19/16/54 250000
Robert Edward 1654 7/22/54 650000
4. nawk
nawk解释器创建于 1985 年。**它是 1977 年awk解释器原始版本的修改。它引入了用户定义的函数、计算的正则表达式和几个输入流。**这使得 AWK 语言更加强大,并且nawk在 1987 年随 Unix System V Release 3.1 广泛使用。
nawk解释器在SunOs、OSF1、IRIS64 等系统中可用 。
它为原始的awk解释器引入了大量新功能。一些功能包括新的关键字,例如delete、do、function和return。
有新的内置函数,例如atan2()、close()、gsub()、cos()、sin()、srand()、rand()、sub()和system()。此外,后续更新中还包括了FNR、ARGC、ARGV、SUBSEP、RSTART和RLENGTH等新变量。
nawk解释器不断更新,最新版本的 nawk 中的一些功能包括:
- 从脚本执行 Unix 命令
- 更轻松地管理多个输入流
- 定义自定义函数
- 刷新打开的输出文件和管道
- 更优雅地处理命令行参数
- 其他Unix命令的处理结果
- 一个名为 ENVIRON 的新预定义变量
nawk命令具有以下基本语法:
$ nawk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
-F fs标志定义输入文件分隔符。nawk在每个输入文件中搜索与prog或一个或多个表示为*-f progfile*的文件中字面定义的任何一组模式匹配的行。
文件…名称代表标准输入,-v var=value是在执行prog之前完成的赋值。我们可以在一个命令中多次使用*-v*选项。
由于原始awk中的所有功能都在nawk中可用,我们可以使用它来打印employees.txt文件中的所有记录:
$ nawk '/Frida}/' employees.txt
Fridah Machanja 1004 19/16/54 250000
在此命令中,我们正在搜索包含模式“Frida”的行。
5. gawk
** gawk解释器最初是在 1970 年代为 Unix 系统开发的。它是 AWK 语言的 GNU 实现。**它是大多数 Linux 系统默认提供的命令行实用程序。大多数发行版还为awk或nawk解释器提供到gawk的符号链接。
gawk提供了最新的贝尔实验室awk扩展和一些 GNU 特定的扩展。这为我们在搜索数据文件时提供了很大的灵活性。
** gawk和nawk解释器允许我们包含自定义函数并管理多个输入和输出流。我们还可以操作命令行参数。**
gawk命令具有以下基本语法:
$ gawk [ POSIX or GNU style options ] -f program-file [ -- ] file
为了能够处理来自不同国家和地区的各种类型的字符,POSIX 添加了对基本和扩展正则表达式的更改。还对括号中的字符类进行了进一步的更改。
gawk是唯一支持这种新的元字符类的解释器。其中一些包括,*[:alnum:]用于字母数字字符,[:digit:]用于数字字符,[:alpha:]用于字母字符和[:graph:]*用于非空白字符。
这是一个如何使用括号字符类的示例。让我们使用它们从示例文件中检索记录:
$ gawk '/R+[[:lower:]]+[[:space:]]+E[[:lower:]]+[[:space:]]+[[:digit:]]/' employees.txt
Robert Edward 1654 7/22/54 650000
gawk扫描字母 R 后跟一个或多个小写字母,后跟一个或多个空格。然后字母E后面是小写字母,然后是空格,最后是数字。 带括号的字符类需要用另一组括号括起来才能被识别为正则表达式。
6. mawk
** mawk解释器最初是由 Mike Brennan 在 1996 年编写的。**然而,直到 2009 年 Thomas E. Dickey 开始进行改进时,才有一段时间没有维护者。他从 Debian 软件包的修复开始,并解决了前维护者未处理的问题。
** mawk是 AWK 语言的解释器,可用于文件操作、原型设计算法和文本处理。**它提供了一些其他 AWK 解释器不具备的功能和扩展。
与其他解释器相比, mawk的大小更小,但在处理记录方面比gawk快得多。 以下是具有*-W前缀的特定于mawk*的选项列表:
- exec 文件:从写入的文件中读取程序
- version : 检查当前的mawk版本
- 交互式:将无缓冲写入设置到标准输出并从标准输入读取
- posix_space : 强制mawk不认为 ‘\n’ 是空间
- 用法:将用法消息打印到标准错误并退出。它类似于*“-W 帮助”。*
- dump : 创建一个类似于汇编器的程序内部表示的列表到标准输出
mawk允许多个*-W*选项,我们可以通过用逗号分隔每个选项来组合它们。
mawk命令具有以下基本语法:
$ mawk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...]
让我们检查一下我们系统上mawk的安装目录:
$ which mawk
/usr/bin/mawk
我们甚至可以检查可用的当前版本:
$ mawk -W version
mawk 1.3.4 20200120
Copyright 2008-2019,2020, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan
random-funcs: srandom/random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 2147483647
让我们使用mawk 打印employees.txt文件的前两行:
$ mawk 'NR~/^(1|2)$/' employees.txt
John Doe 1784 1/22/54 750000
Lucy Kibaki 2054 4/12/54 350000
在这个命令中,我们使用NR,它为我们提供了处理的记录总数,然后我们将列表截断为前两行。我们可以通过用竖线*(’|’)*分隔来指定更多行号。
7. 比较
让我们看一下这张表,其中显示了这些 AWK 解释器之间的比较:
比较因素 | awk | nawk | gawk | mawk |
---|---|---|---|---|
定义 | 用于操作文本文件的 AWK 语言的第一个解释器 | 有时也称为新awk。这是awk的新版本,有额外的更新 | awk 解释器的GNU 表示,并具有特定于gawk的内置功能 | Mike Brennan创建的 AWK 语言解释器 |
格式 | original-awk>original-awk [ -F fs ] [ -v var=value ] [ ‘prog’ | -f progfile ] [ file… ] | nawk [ -F fs ] [ -v var=value ] [ ‘prog’ | -f progfile ] [ file … ] | gawk [ POSIX or GNU style options ] -f program-file [ — ] file | mawk [-W option] [-F value] [-v var=value] [–] ‘program text’ [file …] |
可用选项 | -f progfile 和 -Fc | –v assignment, -F ERE, 和 –f profile | -f, -F, -v, -b, -c, -C, -d, -D, -e, -E, -g, -h, -i, -I, -l, -L, -M, -n, -N, -o, -O, -p, -P, -r, -s, -S, -t, 和 -V | -f, -F, -v, -W dump, –W version, -W exec file, -W interactive, -W posix_space, 和 -W sprintf=num |