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 来获取它的值。句号被视作一个单独的字符。