1 第2.1节:AWK脚本结构
1.1 第1个awk脚本
假设有如下的数据待处理,需要将第2列提取出来:
#, 名称, 大小, 类型, 修改, 属性
1, COMMIT_EDITMSG, 331 bytes, 文件, 24/09/16 08:42:19, -a-----
2, config, 130 bytes, 文件, 24/09/14 11:52:27, -a-----
3, description, 73 bytes, 文件, 24/09/14 11:52:27, -a-----
4, HEAD, 23 bytes, 文件, 24/09/14 11:52:27, -a-----
5, index, 145 bytes, 文件, 24/09/16 08:42:19, -a-----
6, tgitchangelist, 0 bytes, 文件, 24/09/16 08:42:21, -a-----
1.1.1 命令行方式
awk示例:
awk '{print $2}' data.txt
注:awk
命令后的单引号内容表示awk语句。
输出:
名称,
COMMIT_EDITMSG,
config,
description,
HEAD,
index,
tgitchangelist,
1.1.2 脚本方式
将下面的代码复制到文件get_col_2.awk
#!/bin/awk -f
{print $2
}
注意:第1行注释很重要,-f
表示该脚本可以接收文件
执行命令get_col_2.awk data.txt
输出:
$ ./get_col_2.awk data.txt
名称,
COMMIT_EDITMSG,
config,
description,
HEAD,
index,
tgitchangelist,
- 发现什么没有? 不论是命令方式,还是脚本文件方式,awk代码都用
{}
包围。
1.2 模式 - 动作(Pattern - Action)
在 AWK 脚本中,模式 - 动作
是核心结构。模式用于筛选输入数据中的特定行,动作则定义了对这些筛选出来的行要执行的操作。
示例代码:
#!/bin/awk -f
$1 % 2 == 0 {print $1,$2
}$1 % 3 == 0 {print $1,$2
}
上述示例代码中有两个模式和动作,
- 第1个模式:第1列的数字整除2,即
$1 % 2 == 0
,则执行后面{print $1,$2}
中的动作,这里是打印第1、2列。 - 第2个模式:第1列的数字整除3,即
$1 % 3 == 0
,则执行后面的{print $1,$2}
中的动作,这里是打印1、2列,当然,可以做别的事。
输出:
$ ./get_col_2.awk data.txt
#, 名称,
#, 名称,
2, config,
3, description,
4, HEAD,
6, tgitchangelist,
6, tgitchangelist,
注:由于有多个模式-动作
块,所以会发现有些数据打印了多次!
awk的处理逻辑是读取每1行文本,将这行文本丢到每个模式-动作进行处理,如果匹配了模式,则执行该模式对应的动作。
模式可以是关系表达式(如$1 > 100
筛选出第一列数据大于 100 的行)、正则表达式(如/error/
筛选出包含 “error” 字符串的行)等。动作部分则能包含各种 AWK 语句,像变量赋值、数学运算、调用函数等。通过灵活组合模式与动作,实现对数据的精准处理。
1.3 BEGIN 和 END 块
BEGIN 块在 AWK 读取输入数据之前执行,常用于初始化变量、设置环境等操作。例如,在对系统及进程的 CPU、内存进行自动监控分析时,可能需要初始化一些统计变量,记录总的 CPU 使用时长、内存使用峰值等,就可以在 BEGIN 块中完成:
BEGIN {  totalCpuTime = 0  maxMemoryUsage = 0}
END 块在所有输入数据处理完毕后执行,通常用于输出最终结果、清理资源等。继续上面的例子,在分析完所有数据后,我们想输出总的 CPU 使用时长和内存使用峰值的统计结果,就可在 END 块中实现:
END {  print "Total CPU Time:", totalCpuTime  print "Max Memory Usage:", maxMemoryUsage}
通过 BEGIN 和 END 块,能让 AWK 脚本在数据处理的前后阶段完成一些准备和收尾工作,与中间的模式 - 动作结构协同,构建出完整、高效的数据处理流程,这也是 AWK 在数据处理领域强大功能的体现。
1.4 总结:
一个完整的awk
脚本包含以下几部分
- 注释:该注释是有意义的,可以告诉脚本引擎该脚本的执行方式
- BEGIN块:在1行数据都没有处理的时候,进行一些初始化设置,也可以定义一些函数
- 模式-动作块:数据处理代码,可以有多个
模式-动作块
,对同一行数据进行多次处理 - END块:数据全部处理结束后执行的语句
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.