AWK 入门简明教程

AWK 脚本的结构

awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file

awk 脚本通常由3部分组成。 BEGIN , END 和带模式匹配选项的常见语句块。这3个部分都是可 选项,在脚本中可省略任意部分。

AWK 脚本的执行

一、在命令行中执行 AWK 脚本

AWK 脚本包含在单引号之间

awk 'BEGIN { statements } { statements } END { end statements }'

二、把 AWK 脚本写入文件

文件的内容格式如下,在命令使用awk -f <programfile> <inputfile>

  • programfile: AWK 脚本文件
  • inputfile: 被处理的文件
BEGIN { statements } { statements } END { end statements }

AWK 的工作方式

一、AWK工作流程图

AWK工作流程图

Read
AWK从输入流(文件,管道或者标准输入)中读取一行,然后存储到内存中。

Execute
所有的AWK命令都依次在输入上执行。默认情况下,AWK会对每一行执行命令,我们可以通过提供模式限制这种行为。

Repeat
处理过程不断重复,直到到达文件结尾。

二、AWK 执行流程

  1. 执行 BEGIN { commands } 语句块中的语句。
  2. 从文件或 stdin 中读取一行,然后执行 pattern { commands } 。重复这个过程,直到文件全部被读取完毕。
  3. 当读至输入流末尾时,执行 END { commands } 语句块。

三、要点理解

  • BEGIN 语句块在 awk 开始从输入流中读取行之前被执行。这是一个可选的语句块,诸如变量 初始化、打印输出表格的表头等语句通常都可以写入 BEGIN 语句块中。
  • END 语句块和 BEGIN 语句块类似。 END 语句块在 awk 从输入流中读取完所有的行之后即被执 行。像打印所有行的分析结果这类汇总信息,都是在 END 语句块中实现的常见任务(例如,在比 较过所有的行之后,打印出最大数)。它也是一个可选的语句块。
  • 最重要的部分就是 pattern 语句块中的通用命令。这个语句块同样是可选的。如果不提供该 语句块,则默认执行 { print } ,即打印所读取到的每一行。 awk 对于每一行,都会执行这个语 句块。这就像一个用来读取行的 while 循环,在循环体中提供了相应的语句。
  • 每读取一行, awk 就会检查该行和提供的 pattern 是否匹配。pattern 本身可以是正则表达式、条件 语句以及行匹配范围等。如果当前行匹配该 pattern ,则执行 { } 中的语句。
  • pattern 是可选的。如果没有提供样式,那么 awk 就认为所有的行都是匹配的,并执行 { } 中的 语句

AWK 的一些特殊变量

变量名含义
NR表示记录数量,在执行过程中对应于当前行号。
NF表示字段数量,在执行过程中对应于当前行的字段数。
$0这个变量包含执行过程中当前行的文本内容。
$1这个变量包含第一个字段的文本内容。
$2这个变量包含第二个字段的文本内容。
范例效果
$ awk '{ print $3,$2 }' file打印每一行的第2和第3个字段
$ awk 'END{ print NR }' file统计文件中的行数

将外部变量值传递给 AWK

借助选项 -v ,我们可以将外部值(并非来自 stdin )传递给 awk

$ VAR=10000
$ echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
10000

用 getline 读取特定行:

awk 通常默认读取一个文件的所有行。如果只想读取某一行,可以使用 getline 函数。有时候,我们需要从 BEGIN 语句块中读取第一行。

语法: getline var
变量 var 就包含了特定行的内容。如果调用不带参数的 getline ,我们可以用 $0$1$2 访问文本行的内容。

$ seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 } { print $0 }'
Read ahead first line 1
2
3
4
5

使用过滤模式对 AWK 处理的行进行过滤:

范例效果
awk 'NR < 5'行号小于5 的行
awk 'NR==1,NR==4'行号在1到5之间的行
awk '/linux/'包含样式linux 的行(可以用正则表达式来指定模式)
awk '!/linux/'不包含包含模式为linux

设置字段定界符:

默认的字段定界符是空格。我们也可以用 -F “delimiter” 明确指定一个定界符
$ awk -F: '{ print $NF }' /etc/passwd
在 BEGIN 语句块中则可以用 OFS="delimiter" 设置输出字段的定界符。

从 AWK 中读取命令输出:

将命令的输出结果读入变量 output 的语法如下
"command" | getline output ;

$ echo | awk '{ "grep root /etc/passwd" | getline cmdout ; print cmdout }'
root:x:0:0:root:/root:/bin/bash

通过使用 getline ,我们将外部shell命令的输出读入变量 cmdout 。

在 awk 中可以使用 for 循环,其格式如下:

for(i=0; i<10; i++) { print $i ; }
或者
for(i in array) { print array[i]; }

AWK 内建的字符串控制函数

范例效果
length(string)返回字符串的长度。
index(string, search_string)返回 search_string 在 string 中出现的位置。
split(string, array, delimiter)用定界符生成一个字符串列表,并将该列表存 入数组。
substr(string, start-position, end-position)在字符串中用字符起止偏移 量生成子串,并返回该子串。
sub(regex, replacement_str, string)将正则表达式匹配到的第一处内容替换成 replacment_str 。
gsub(regex, replacment_str, string)和 sub() 类似。不过该函数会替换正则表达式匹配到的所有内容。
match(regex, string)检查正则表达式是否能够匹配字符串。如果能够匹配,返回 非0值;否则,返回0。
1. 前言 这是一本awk学习指引, 其重点着重于 :  awk 适于解决哪些问题 ?  awk 常见的解题模式为何 ? 为使读者快速掌握awk解题的模式及特性, 本手册系由一些较具代表性的范例及其题解所构成; 各范例由浅入深, 彼此间相互连贯,范例中并对所使用的awk语法及指令辅以必要的说明. 有关 awk的指令, 函数,...等条列式的说明则收录于附录中, 以利读者往后撰写程序时查阅. 如此编排, 可让读者在短时间内顺畅地学会使用awk来解决问题. 建议读者循着范例上机实习, 以加深学 习效果. 读者宜先具备下列背景 : [a.] UNIX 环境下的简单操作及基本概念. 例如 : 文件编辑, 文件复制 及 管道, 输入/输出重定向 等概念 [b.] C 语言的基本语法及流程控制指令. (awk 指令并不多, 且其中之大部分与 C语言中之用法一致, 本手册中对该类指令之语法及特性 不再加以繁冗的说明, 读者若欲深究,可自行翻阅相关的 C 语言书籍) 2. awk概述 为什么使用awk awk 是一种程序语言. 它具有一般程序语言常见的功能. 因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分 (Typeless), 可使用文字当数组的下标(Associative Array)...等特色. 因此, 使用awk撰写程序比起 使用其它语言更简洁便利且节省时间. awk还具有一些内建功能, 使得awk擅于处理具数据行 (Record), 字段(Field)型态的资料; 此外, awk内建有pipe的功能, 可将处理中的数据传送给外部 的 Shell命令加以处理, 再将Shell命令处理后的数据传回awk程序, 这个特点也使得awk程序很 容易使用系统资源. 由于awk具有上述特色, 在问题处理的过程中, 可轻易使用awk来撰写一些小工具; 这些小工具 并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色, 可藉由Shell所提供的pipe 将数据按需要传送给不同的小工具进行处理, 以解决整个大问题. 这种解题方式, 使得这些小工 具可因不同需求而被重复组合及重用(reuse); 也可藉此方式来先行测试大程序原型的可行性与 正确性, 将来若需要较高的执行速度时再用C语言来改写.这是awk最常被应用之处. 若能常常 如此处理问题, 读者可以以更高的角度来思考抽象的问题, 而不会被拘泥于细节的部份. 本手册为awk入门的学习指引, 其内容将先强调如何撰写awk程序,未列入进一步解题方式的应 用实例, 这部分将留待UNIX进阶手册中再行讨论.
AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也越来越迫切,ZLG开源 GUI 引擎 AWTK 应运而生。AWTK 全称为 Toolkit AnyWhere,是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发MacOS应用程序。 支持开发Windows应用程序。 支持开发Android应用程序。 支持开发iOS应用程序。 支持开发2D游戏。 其主要特色有: 小巧。在精简配置下,不依赖第三方软件包,仅需要32K RAM + 256K FLASH即可开发一些简单的图形应用程序。 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。 丰富的GUI组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要的组件,降低对运行环境的要求)。 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用stb_truetype或freetype加载ttf字体。 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用stb_image加载png/jpg等格式的图片。 紧凑的二进制界面描述格式。可以手工编辑的XML格式的界面描述文件,也可以使用Qt Designer设计界面,然后转换成紧凑的二进制界面描述格式,提高运行效率,减小内存开销。 支持主题并采用紧凑的二进制格式。开发时使用XML格式描述主题,然后转换成紧凑的二进制格式,提高运行效率,减小内存开销。 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。 内置nanovg实现高质量的矢量动画,并支持SVG矢量图。 支持窗口动画、控件动画、滑动动画和高清LCD等现代GUI常见特性。 支持国际化(Unicode、字符串翻译和输入法等)。 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。 支持硬件2D加速(目前支持STM32的DMA2D和NXP的PXP)和GPU加速(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。 丰富的文档和示例代码。 采用LGPL协议开源发布,在商业软件中使用时无需付费。 目前核心功能已经完成,内部开始在实际项目中使用了,欢迎有兴趣的朋友评估和尝试,期待您的反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值