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