如何使用 Awk 编程语言编写脚本?


Awk 是一种强大的文本处理语言,以其三位最初的作者命名:Alfred Aho、Peter Weinberger 和 Brian Kernighan。它是一种用途广泛的语言,主要用于模式扫描和处理。Awk 是 Unix 脚本的核心,通常用于数据提取、报告和数据转换等任务。

Awk 脚本编写速度快,并且在处理中小型任务时性能良好。在本文中,我们将向您介绍使用 Awk 编程语言编写脚本的基础知识。

基本语法

一个 Awk 程序由一系列模式-动作对组成,写成如下形式:

pattern { action }

这里,模式是一个条件。如果输入行与模式匹配,则执行动作。

例如:

awk '/search_pattern/ { print $0 }' file_name

在这个例子中,awk 将在文件 file_name 中搜索包含 search_pattern 的行,如果匹配,则打印整行($0)。

使用变量

Awk 有一些内置变量,您可以使用它们来格式化输出。一些最常用的变量包括:

  • $0 - 整行。

  • $1, $2, ... - 每个单独的字段(默认以空格分隔)。

  • FS - 字段分隔符(默认为空格)。

  • OFS - 输出字段分隔符(默认为空格)。

  • NR - 已处理的记录数。

  • NF - 当前记录中的字段数。

让我们来看一个使用其中一些变量的实际例子。假设我们有一个名为 'students.txt' 的文本文件,其内容如下:

John Doe 18
Jane Smith 19

我们可以使用 awk 分别打印姓名和年龄:

awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt

输出将是:

Name: John Doe, Age: 18
Name: Jane Smith, Age: 19

控制流

Awk 还支持常见的控制流机制,如 if、else、while 和 for。以下是一个使用 if 和 else 的示例:

awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt

输出将是:

John is an adult
Jane is a minor

函数

Awk 具有用于字符串操作、算术运算和输入/输出等的内置函数。您还可以定义自己的函数。

以下是一个用户定义函数的示例,该函数将温度从华氏转换为摄氏:

function toCelsius(fahrenheit) {
   return (fahrenheit - 32) * 5/9
}

BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }

如果我们有一个输入文件 'temperatures.txt',其中包含华氏温度:

32
212

输出将是:

Fahrenheit Celsius
32 0
212 100

正则表达式

Awk 支持正则表达式语法,可用于模式匹配。以下是一个基本示例,我们将在 'students.txt' 中搜索以字母 'J' 开头的行:

awk '/^J/ { print $0 }' students.txt

在这种情况下,插入符号 (^) 表示行的开头。此脚本将输出:

John Doe 18
Jane Smith 19

数组

Awk 支持一维数组,可用于更复杂的数据操作。让我们考虑一个我们想要计算 'students.txt' 文件中年龄出现次数的情况。以下是如何做到这一点:

awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt

这将输出:

18 appears 1 times.
19 appears 1 times.

在此脚本中,count[$3]++ 使用年龄(第三个字段)作为数组的键,并在每次出现时递增其值。

高级数据操作

Awk 还提供了一些内置函数来进行更高级的数据操作。例如,它提供了 split() 函数,该函数可以将字符串拆分为数组:

awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt

此脚本将输出:

First letter of the name: J
First letter of the name: J

将 Awk 与其他 Unix 命令结合使用

您可以使用管道 (|) 将 Awk 脚本与其他 Unix 命令结合使用,这使其成为一个更强大的工具:

cat students.txt | awk '{ print $1 }' | sort | uniq

此命令将打印学生的姓名,对其进行排序,然后删除任何重复项。在这种情况下,输出将是:

Jane
John

在 Awk 中使用脚本

虽然在终端中直接使用 Awk 对于简单任务很常见,但对于更复杂的操作,编写脚本可能更方便。Awk 脚本遵循相同的模式-动作结构,但写在一个单独的文件中。

首先,创建一个扩展名为 .awk 的新文件。脚本的第一行应该是 shebang 行,指向 Awk 解释器:

#!/usr/bin/awk -f

让我们创建一个名为 'students.awk' 的 Awk 脚本,用于计算学生的平均年龄:

#!/usr/bin/awk -f
BEGIN { 
   sum = 0
   count = 0
}
{ 
   sum += $3
   count++ 
}
END {
   print "Average age: " sum/count
}

要运行脚本,请使用 chmod +x students.awk 使其可执行,然后使用 ./students.awk students.txt 运行它。这将打印:

Average age: 18.5

调试 Awk 脚本

由于缺乏内置调试工具,调试 Awk 脚本可能有点棘手。但是,使用 print 语句在脚本的不同位置显示变量的值可能会有所帮助。

此外,-W dump-variables[=file] 选项可用于将所有变量和数组转储到文件中以进行调试。要使用此选项,您将执行 awk -W dump-variables=dump.txt script.awk。

高级模式匹配

Awk 还支持使用正则表达式的高级模式匹配。例如,您可以使用 ~ 运算符将字段与正则表达式匹配。

考虑一个 students.txt 文件,其中包含一个他们正在学习的课程的附加字段:

John Doe 18 ComputerScience
Jane Smith 19 Mathematics

要查找学习计算机科学的学生,您可以编写:

awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt

这将输出:

John Doe is studying Computer Science.

结论

Awk 是一个用于在基于 Unix 的系统上进行文本处理的强大工具。它的强大之处在于其简单性和语法的直接性。无论您是在操作文本还是执行算术计算,Awk 都是您编程工具包中一个优秀的工具。

请记住,学习 Awk(或任何语言)的最佳方法是使用它。尝试创建自己的 Awk 脚本,从简单的任务开始,然后随着您对语言的熟悉程度逐渐转向更复杂的任务。

更新于:2023年7月17日

111 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.