AWK 命令

2025年3月17日 | 阅读 8 分钟

awk 命令在 Linux 中用于文本处理。虽然 sed 命令也用于文本处理,但它有一些局限性,因此 awk 命令成为文本处理的得力助手。它提供了对数据的强大控制。

Awk 是一种强大的用于文本脚本的脚本语言。它搜索和替换文本,以及排序、验证和索引数据库。

它是程序员最广泛使用的工具之一,因为他们以语句的形式编写缩减的有效程序,以定义文本模式和设计。

它在 Linux 中充当过滤器。在 Linux 中,它也被称为gawk (GNU awk)

AWK 命令是一种领域特定语言,专为文本处理而开发,并用作报告和数据提取工具。它是一种数据驱动的脚本语言,由一组要对文本数据流采取的操作组成——可以直接在文件上运行,也可以作为管道的一部分使用——目的是转换和提取数据,例如生成格式化报告。

该语言使用正则表达式、关联数组和字符串数据类型。该语言是图灵完备的,早期的 AWK Bell Lab 用户经常指定结构良好的 AWK 程序,而 AWK 的应用领域有限,并且是专门为支持单行程序而开发的。

它为什么被命名为 AWK?

该命令的命名使用了创建该命令原始版本的三个人的名字的首字母,时间是 1977 年。他们的名字是Alfred Aho、Peter WeinbergerBrian Kernighan,他们来自AT&T Bell Laboratories

AWK 命令的特性

Awk 命令的各种特性如下:

  • 它逐行扫描文件。
  • 它将文件分割成多个字段。
  • 它比较输入文本或文本文件的一个片段。
  • 它对文件执行各种操作,例如搜索指定文本等。
  • 它格式化输出行。
  • 它执行算术和字符串操作。
  • 它对输出应用条件和循环。
  • 它根据指定的结构转换文件和数据。
  • 它生成格式化报告。

语法

Awk 命令的使用方法如下:

选项可以是:

  • -f program files:它读取在 awk 命令上编写的脚本源代码。
  • -F fs:它用作输入字段分隔符。

AWK 程序结构

AWK 程序是由模式-动作对组成的集合,指定为:

其中动作是一组命令,条件是一个表达式。输入被分成记录,记录默认由换行符分隔,因此输入被分成不同的行。程序将所有记录与所有条件进行检查,并对所有为真的表达式执行动作。动作或条件都可以省略。条件默认为与所有记录相同。动作(默认)是显示记录。与 sed 一样,它具有类似的模式-动作结构。

除了常见的逻辑和算术运算符外,AWK 表达式还包含 '~'(波浪号运算符),它相当于对任何字符串进行正则表达式匹配。如果没有波浪号运算符,/regexp/ 就等于当前记录,因为它可以作为句法糖。该语法借鉴自 sed,sed 又借鉴自 ed 编辑器,在 ed 中,/ 用于搜索。这种使用斜杠作为正则表达式分隔符的语法已被 ECMAScript 和 Perl 采用,现在很普遍。此外,波浪号运算符也被 Perl 接受。

实现和版本

最初,AWK 于 1977 年指定,并随 Unix Version 7 发布。AWK 的作者于 1985 年开始开发该语言,最重要的是增加了用户定义函数。该语言在 1988 年发布的《AWK 编程语言》一书中进行了定义,其实现已在 UNIX System V 版本中提供。

该版本有时被称为nawk“new awk”,以避免与早期版本混淆。该实现于 1996 年根据免费软件许可证发布,至今仍由 Brian Kernighan 管理。
旧的 Unix 版本,如 UNIX/32V,添加了 awkcc,它将 AWK 转换为 C。

  • BWK awk,也称为nawk,代表Brian Kernighan的版本。由于该术语与定义该语言的书籍以及 Kernighan 是 AWK 原始作者之一的事实有关,因此该版本被称为“One True AWK”。FreeBSD 将此版本称为 one-true-awk。
    此外,此版本还包含书中没有的方面,例如 ENVIRON 和 tolower。此版本被 illumos、macOS、OpenBSD、NetBSD、FreeBSD 和 Android 使用。Arnold Robbins 和 Brian Kernighan 是 nawk 源代码库的主要贡献者。
  • GNU awk,或 gawk,也是一个免费软件实现,在实现 TCP/IP 网络以及国际化和本地化方面取得了很大进展。在实际实现免费可用之前就已指定。
    它增加了自己的调试器;其性能分析器允许用户对任何脚本进行性能增强。此外,它还允许用户使用共享库来增加功能。一些 Linux 发行版将 gawk 添加为默认的 AWK 实现。
  • mawk是基于 Mike Brennan 的字节码解释器之一,速度最快的 AWK 实现之一。
  • libmawk是 mawk 的一个分支,允许应用程序插入两个或更多并行的 awk 解释器实例。
  • awka是另一个 AWK 脚本到 C 代码的翻译器。
  • tawk是一个适用于 Windows、OS/2、DOS 和 Solaris 的 AWK 编译器,以前由 Thompson Automation Software 拥有。
  • Jawk是一个在 Java 中实现 AWK 的项目,托管在 SourceForge 上。
  • xgawk是 gawk 的一个分支,通过动态加载库来扩展 gawk。XMLgawk 扩展已合并到 GNU AWK 的官方 4.1.0 版本中。
  • QSEAWK是 QSE 库中一个固定的 AWK 解释器实现,它为 C++ 和 C 提供了嵌入式 API。
  • libfawk是一个嵌入式、非常小巧、可重入且仅限函数的解释器,用 C 编写。
  • CLAWK由 Michael Parker 提供了一个 Common Lisp 中的 AWK 实现,该实现基于同名作者的正则表达式库。
  • BusyBox添加了一个由 Dmitry Zakharov 指定的 AWK 实现。这是一个非常小的实现,兼容嵌入式系统。

如何定义 AWK 脚本?

要定义 awk 脚本,请使用 awk 命令,后跟用单引号 '' 包围的大括号 {},如下所示:

当我们每次执行该命令时,上面的命令都会打印输入的字符串。按CTRL+D键终止程序。请看下面的输出:

AWK Command

AWK 命令示例

为了更好地理解 Awk 命令,请看下面的示例:

让我们创建一个数据来应用各种 awk 操作。考虑来自不同专业的学生数据。

要创建数据,请按如下方式执行 cat 命令:

CTRL + D键保存文件,然后按ESC键退出命令行编辑器。这将创建数据。请看下面的输出:

AWK Command

已创建学生数据,我们将在此数据上操作 awk 命令。

示例 1:列出具有指定模式的学生。

考虑以下命令:

输出

AWK Command

示例 2:awk 命令的默认行为。

如果我们不指定模式,它将显示文件的所有内容。

考虑以下命令:

我们在上面的命令中没有指定任何模式,因此它将显示文件的所有行。

输出

AWK Command

示例 3:打印指定的列。

如果我们在此命令中指定列号,它将仅打印该行。请看下面的输出:

上面的命令将打印第 1 列和第 5 列。如果文件系统中不存在第 5 列,它将仅打印第 1 列。

考虑下面的输出

AWK Command

考虑以下命令:

上面的命令将列出第 1 和第 2 列。请看下面的输出:

AWK Command

AWK 命令中的内置变量

Awk 命令支持许多内置变量,包括 $1、$2 等,它们将文件内容分解为单独的段。

NR:用于显示行号。awk 命令对每一行执行一次操作。这些行称为记录。

NF:用于计算当前数据库中的字段数。

FS:用于创建字段分隔符,以将字段分隔到输入行中。

OFS:用于存储输出字段分隔符。它分隔输出字段。

ORS:用于存储输出记录分隔符。它分隔输出记录。它会自动打印 ORS 命令的内容。

示例 4:打印输出并显示行号。

要在输出中显示行号,请使用 NR 变量和 Awk 命令,如下所示:

考虑下面的输出

AWK Command

示例 5:打印文件的最后一个字段。

要显示文件的最后一个字段,请使用 NF 变量和 Awk 命令,如下所示:

考虑下面的输出

AWK Command

示例 6:按指定格式分隔输出。

要用 '-' 符号或 (:) 分号分隔输出,请使用 ORS 命令指定,如下所示:

上面的命令将用下划线 (_) 符号分隔输出。请看下面的输出:

示例 7:打印 1 到 8 的数字的平方。

要打印 1 到 8 的数字,请执行以下命令:

上面的命令将打印 1 到 8 的平方。请看下面的输出:

square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36
square of 7 is 49
square of 8 is 64

示例 8:计算特定列的总和。

让我们创建一个数据来对列执行求和操作。要创建学生分数数据,请按如下方式执行 cat 命令:

CTRL+D保存文件。我们已成功创建 StudentsMarks 数据。我们可以通过执行 cat 命令来检查它,如下所示:

要计算创建数据中的第三列,请执行以下命令:

输出

600

考虑下面的输出

AWK Command

示例 9:查找一些单个记录。

要打印一些单个学生的分数记录,请执行以下命令:

上面的命令将从 StudentMarks 文件中打印出每个人的姓名及其分数。请看下面的输出:

AWK Command

示例 10:查找 exp 8 的值。

要查找 exp 8 的值,请执行以下命令:

上面的命令将打印 exp 8 的值。请看下面的输出:

AWK Command
下一主题Linux make 命令