如何使用 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 脚本,从简单的任务开始,然后随着您对语言的熟悉程度逐渐转向更复杂的任务。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP