如何在 Linux 上使用 awk 命令

Linux 中的文本处理利器:awk

在 Linux 系统中,awk 不仅仅是一个命令行工具,它更是一种强大的文本处理语言。它能够高效地进行文本操作,并具备完整的脚本编程能力。下面我们来深入了解一下 awk 的一些核心特性。

awk 名称的由来

awk 这个名字来源于其最初的三个开发者,他们的名字首字母组合成了 awk。他们分别是:
阿尔弗雷德·阿霍
彼得·温伯格
布赖恩·克尼汉。这三位都是来自 美国电话电报公司 贝尔实验室 的传奇人物,为 Unix 系统的发展做出了卓越的贡献。自诞生以来,awk 经历了持续的演变和完善,吸收了众多开发者的智慧和贡献。

awk 不仅是一个功能强大的文本处理工具,更是一种完备的脚本语言。如果您对 awk 的细节感兴趣,可以查阅 官方文档,了解它的全部功能。

规则、模式和操作

awk 的工作原理是基于规则,每一条规则都由一个模式和一个操作组成。当输入的文本行与模式匹配时,相应的操作就会被执行。模式通常用花括号 ({}) 包裹,而一个完整的规则则由模式和操作共同构成。整个 awk 程序通常用单引号 (‘) 包裹。

让我们从最简单的 awk 程序开始。这种程序不包含模式,因此会对输入中的每一行文本都执行操作。例如,我们可以使用 awk 来处理 who 命令的输出。

这是 who 命令的标准输出:

who

假设我们只需要用户名,而不需要其他信息,我们可以将 who 命令的输出通过管道传递给 awk,然后告诉 awk 只输出第一个字段。

默认情况下,awk 将字段视为被空格、行首或行尾分隔的字符串。字段通过美元符号 ($) 和数字来标识。例如,$1 代表第一个字段。我们可以使用 print 操作来输出特定的字段。

输入以下命令:

who | awk '{print $1}'

awk 会输出每一行的第一个字段,并忽略其他部分。

我们可以输出任意多个字段。如果我们使用逗号作为分隔符,awk 会在每个字段之间插入一个空格。

如果我们想要输出用户的登录时间(第四个字段),可以输入以下命令:

who | awk '{print $1,$4}'

以下是一些特殊的字段标识符,用于代表整行文本和行中的最后一个字段:

$0: 代表整行文本。
$1: 代表第一个字段。
$2: 代表第二个字段。
$7: 代表第七个字段。
$45: 代表第 45 个字段。
$NF: 代表最后一个字段。

现在,让我们创建一个包含丹尼斯·里奇名言的文本文件:

cat dennis_ritchie.txt

我们希望 awk 输出这段名言的第一个、第二个和最后一个字段。需要注意的是,尽管这句话在终端窗口中显示为多行,但实际上它是一行文本。

输入以下命令:

awk '{print $1,$2,$NF}' dennis_ritchie.txt

我们不需要知道句号在文本行中的位置,无论它是第几个字段,我们都可以通过 $NF 来获取它的值。句号被视作一个单独的字符。