网站搜索

awk 学习实用指南


下载我们的免费电子书,更好地掌握 awk 命令。

在所有 Linux 命令中(有很多),最典型的三个命令似乎是 sed、awk 和 grep。也许是因为它们的名字听起来很神秘,或者是它们潜在用途的广度,或者只是它们的年龄,但当有人给出“Linuxy”命令的例子时,它通常是这三个命令之一。虽然 sed 和 grep 都有几个简单的单行标准,但不太出名的 awk 仍然因特别令人困惑而一直突出。

您可能会使用 sed 进行快速字符串替换,或使用 grep 每天过滤模式。您编写 awk 命令的可能性要小得多。我经常想知道这是为什么,我将其归因于一些事情。首先,我们中的许多人几乎不使用 sed 和 grep 来执行任何操作,除了这两个命令的一些变化:

$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt

因此,即使您可能对 sed 和 grep 感觉更舒服,但您可能无法充分发挥它们的潜力。当然,没有义务学习更多有关 sed 或 grep 的知识,但我有时想知道我“学习”命令的方式。我经常学习包含命令的特定咒语,而不是学习命令的工作原理。因此,我常常对这个命令产生一种虚假的熟悉感。我想我知道一个命令,因为我可以立即说出三个或四个选项,即使我不知道这些选项的作用,也不能完全掌握语法。

我相信,这就是许多人在面对 awk 的强大功能和灵活性时所面临的问题。

学习awk使用awk

awk 的基础知识非常简单。人们经常注意到 awk 是一种编程语言,尽管它是一种相对基础的语言,但事实确实如此。这意味着您可以像学习新的编码语言一样学习 awk:使用一些基本命令学习其语法,学习其词汇,以便可以构建复杂的操作,然后练习、练习、再练习。

awk 如何解析输入

Awk 本质上将输入视为数组。当 awk 扫描文本文件时,它将每一行单独且连续地视为一条记录。每条记录都分为字段。当然,awk 必须跟踪这些信息,您可以使用 NR(记录数)和 NF(记录数)查看该数据。字段)内置变量。例如,这将为您提供文件的行数:

$ awk 'END { print NR;}' example.txt
36

这也揭示了有关 awk 语法的一些内容。无论您将 awk 编写为单行脚本还是独立脚本,awk 指令的结构都是:

pattern or keyword { actions }

在此示例中,单词 END 是一个特殊的保留关键字,而不是一个模式。类似的关键字是BEGIN。使用这两个关键字,awk 仅在解析数据的开始或结束时执行大括号中的操作。

您可以使用模式作为过滤器或限定符,以便awk仅在能够将您的模式与当前记录匹配时才执行给定操作。例如,假设您想要使用 awk(就像使用 grep 一样)在文本文件中查找单词 Linux:

$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)

对于awk来说,文件中的每一行都是一条记录,记录中的每个单词都是一个字段。默认情况下,字段之间用空格分隔。您可以使用 --field-separator 选项进行更改,该选项将 FS(字段分隔符)变量设置为您想要的任何值:

$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt 
 CentOS Linux (10.1.1.8)
 CentOS Linux (10.1.1.9)
 Red Hat Enterprise Linux (RHEL) (10.1.1.11)
 Elementary Linux (10.1.2.4)
 Elementary Linux (10.1.2.5)
 Elementary Linux (10.1.2.6)

在此示例中,每个列表之前都有一个空格,因为源文本中每个冒号 (:) 之后都有一个空格。不过,这不是 cut,因此字段分隔符不必限于一个字符:

$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt 
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)

awk 中的函数

您可以使用以下语法在 awk 中构建自己的函数:

name(parameters) { actions }

函数很重要,因为它们允许您编写一次代码并在整个工作中重复使用它。构建单行代码时,自定义函数的用处不如脚本中的有用,但是 awk 已经为您定义了许多函数。它们的工作原理与任何其他语言或电子表格中的任何函数基本相同:您可以了解该函数需要您提供的信息的顺序,并且您可以向其提供任何您想要的结果。

有一些函数可以执行数学运算和字符串处理。数学问题通常相当简单。你提供一个数字,它会对其进行处理:

$ awk 'BEGIN { print sqrt(1764); }'
42

字符串函数可能更复杂,但在 GNU awk 手册中有详细记录。例如,split 函数将 awk 视为单个字段的实体并将其拆分为不同的部分。它需要一个字段、一个用作包含拆分每个部分的数组的变量,以及要用作分隔符的字符。

使用前面示例的输出,我知道每条记录的最后都有一个 IP 地址。在这种情况下,我可以通过引用变量 NF 来将记录的最后一个字段发送到 split 函数,因为它包含字段数(并且最终字段必须是最大的数):

$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2

还有更多函数,没有理由将自己限制为每个 awk 代码块一个。您可以在终端中使用 awk 构建复杂的管道,也可以编写 awk 脚本来定义和使用您自己的函数。

下载电子书

学习awk主要是使用awk。使用它,即使这意味着复制您已经使用 sed 或 grep 或 cut 或 tr 或任何其他功能完全有效的命令。一旦熟悉了它,您就可以编写 Bash 函数来调用自定义 awk 命令,以便于使用。最终,您将能够编写脚本来解析复杂的数据集。

下载我们的电子书,了解有关 awk 的所有信息,今天就开始使用它。

相关文章: