当前位置: 首页 > article >正文

第2.1节:AWK脚本结构

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.


http://www.kler.cn/a/595553.html

相关文章:

  • Resume全栈项目(.NET)
  • 华为总部-华为东莞松山湖基地参观游学攻略
  • 【DeepSeek 学C+】effective modern c+ 条款七 初始化
  • PurpleLlama大模型安全全套检测方案
  • OpenCV ML 模块使用指南
  • 机器学习-04-分类算法-02贝叶斯算法案例
  • 电脑自动关机故障维修案例分享
  • FRP在远程办公中的实战应用
  • 23种设计模式(扩展)
  • HUGO介绍、安装、以及使用
  • 视频翻译器免费哪个好?轻松玩转视频直播翻译
  • 用 pytorch 从零开始创建大语言模型(五):预训练无标注数据
  • 自适应柔顺性策略:扩散引导控制中学习近似的柔顺
  • wordpress表单插件CF7调用方式
  • 防止重复点击方法总结-微信小程序
  • 基于ChatGPT、GIS与Python机器学习的地质灾害风险评估、易发性分析、信息化建库及灾后重建高级实践
  • 【视觉提示学习】3.21论文随想
  • ensp 公司组网拓扑图
  • scrapy入门(深入)
  • SpringCloud负载均衡:Ribbon核心组件与策略配置