文章目录
- 3.1 awk [选项] '{编辑指令}' 文件
- 3.2 与管道结合
- 3.3 awk [选项] '[条件]{编辑指令}' 文件
- 3.3 awk [选项] ' BEGIN{编辑指令 } {编辑指令} END{编辑指令}' 文件
- 打印第n参数到最后一个参数
- 将多行文本内容合并为一行
- 3.4 获取外部变量方法
- 4.1 FS 指定字段un列分隔符(Font Space)
- 4.2 OFS 指定输出字段列分隔符(Output Font space)
- 4.3 RS指定行分隔符 默认分隔符为\n(Row Space)
- 4.4 ORS指定输出行分隔符
- 4.5 RT 代指分隔符
- 4.6 NF 每行字段总数(Number of Font)
- 4.7 NR 当前行数(Number of Row)
1. awk介绍
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk
,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名称得自于它的创始人 Alfred Aho
、Peter Weinberger
和 Brian Kernighan
姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
2. awk原理
AWK 工作流程可分为三个部分:
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)。
命令结构:
下面的流程图描述出了 AWK 的工作流程:
- 1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
- 2、完成 BEGIN 块的执行,开始执行body块。
- 3、读入有 \n 换行符分割的记录。
- 4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),n 表示第 n 个域。
- 5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
- 6、循环读取并执行各行直到文件结束,完成body块执行。
- 7、开始 END 块执行,END 块可以输出最终结果。
3.实例
3.1 awk [选项] ‘{编辑指令}’ 文件
3.2 与管道结合
3.3 awk [选项] ‘[条件]{编辑指令}’ 文件
3.3 awk [选项] ’ BEGIN{编辑指令 } {编辑指令} END{编辑指令}’ 文件
打印第n参数到最后一个参数
第一反应是使用循环
但其实可以使用CU帽神给的技巧
如果分隔符比较标准的话(即使用的是统一的标准分隔符),建议还是用cut命令比较嗨皮
帽子神写的从第三个到最后一个
将多行文本内容合并为一行
3.4 获取外部变量方法
3.4.1 获得普通外部变量
语法:
这样传入变量,可以在action中获得值。 注意:变量名与值放到’{action}’后面。
3.4.2 BEGIN程序块中变量
格式如:
注意:用-v 传入变量可以在3中类型的action 中都可以获得到,但顺序在 action前面。
3.4.3 获得环境变量
只需要调用:
awk内置变量 ENVIRON
,就可以直接获得环境变量。它是一个字典数组。环境变量名 就是它的键值。
4. 内建变量FS,NF,NR,RT,RS,ORS,OFS
4.1 FS 指定字段un列分隔符(Font Space)
4.2 OFS 指定输出字段列分隔符(Output Font space)
4.3 RS指定行分隔符 默认分隔符为\n(Row Space)
4.4 ORS指定输出行分隔符
4.5 RT 代指分隔符
4.6 NF 每行字段总数(Number of Font)
4.7 NR 当前行数(Number of Row)
5. awk脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
我们来看一下执行结果:
6. AWK 用户自定义函数
用户自定义函数的语法格式为:
- function_name 是用户自定义函数的名称。函数名称应该以字母开头,其后可以是数字、字母或下划线的自由组合。AWK
保留的关键字不能作为用户自定义函数的名称。 - 自定义函数可以接受多个输入参数,这些参数之间通过逗号分隔。参数并不是必须的。我们也可以定义没有任何输入参数的函数。
- function body 是函数体部分,它包含 AWK 程序代码。
求最大值与最小值
执行 functions.awk 文件,可以得到如下的结果:
7. AWK 数组
AWK 可以使用关联数组这种数据结构,索引可以是数字或字符串。
AWK关联数 组也不需要提前声明其大小,因为它在运行时可以自动的增大或减小。
数组使用的语法格式:
- array_name:数组的名称
- index:数组索引
- value:数组中元素所赋予的值
7.1 创建数组
接下来看一下如何创建数组以及如何访问数组元素:
执行以上命令,输出结果为:
7.2 删除数组元素
我们可以使用 delete 语句来删除数组元素,语法格式如下:
下面的例子中,数组中的 google 元素被删除(删除命令没有输出):
输出为空。
7.3 多维数组
下面是模拟二维数组的例子:
执行上面的命令可以得到如下结果:
8. split方法