网站搜索

如何使用 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 脚本,从简单的任务开始,随着您对该语言的熟悉程度逐渐转向更复杂的任务。

相关文章: