Linux命令备忘实例(15)——awk(1/2)

来源:互联网 发布:张丕林 知乎 编辑:程序博客网 时间:2024/06/06 01:11

awk是以三位发明这个工具的人的名字的首字母组合而成的,这个工具用来进行文本处理非常强大,可以进行行列操作,而且本身就是具有很多内建功能,可以看成awk提供了一种类似于C语言强大的语言子集,从简单的文本处理到任意复杂的处理基本都可以写出脚本来进行处理。本文首先对awk的基本结构和功能进行总结。

1. 命令结构

awk的基本使用如下:

awk [-F value] [-f file]  [-v var=value] [--]

-F选项表示显式地设置FS(field seperator)变量的值。-f则是使用紧接的文件作为脚本输出,-v可以在脚本中使用var变量。最后的“–”选项明显表明选项的结束。

2.脚本结构与原理

1.基本结构

awk的执行使用上述的命令结构进行执行即可,和其他命令的执行相似。但是,awk的核心在于执行的脚本内容,这个脚本内容基本上提供了类似C语言的一种语言子集,可以进行编程。对于复杂的脚本可以放在一个单独的文件中,使用-f选项引用文件即可。对于一般简单的命令可以直接在awk命令后的引号(一般使用单引号,内部可以使用双引号编程)参数中书写。不论以何种方式,脚本的结构都相同:

    BEGIN{ .... }    ...    pattern    ...    END{ ... }

分别包含三块:BEGIN块、END块、pattern块。三个部分都是可选的,任何一部分都可以不出现在脚本中。

2.工作原理

(1)首先执行BEGIN{…}中的语句块,只在开始的时候执行一次,一般做变量初始化操作,或者打印表格的表头操作等。
(2)从文件或者stdin中读取一行内容,然后使用这行内容去执行pattern语句,对文件的这一行进行操作,pattern支持变量、内置函数、数组等数据结构、自定义函数等。
(3)重复执行步骤(2)直到文件结尾的时候,执行END{…}语句块。END块仅在文件操作完成之后执行一次,可以用来做统计汇总信息的分析。
上述操作最重要的就是pattern语句块,这个语句块默认是执行“{print}”,也就是打印每一行。pattern就是awk命令提供的各种功能的表达的地方,可以使用行匹配、正则表达式、条件、循环、函数调用等各种特性。

3. awk脚本编程语言(1/2)

1.表达式和运算符

表达式的语法与C语言的语法类似,主要的语法有数值常量、字符串常量、变量、字段、数组和函数调用。标示符的命名规则和C语言相同。但是变量不用进行声明,在第一次引用的时候初始化为NULL。
支持的运算符也和C语言类似,有个别不同:
这里写图片描述
其中的运算符“$”是用来进行字段选择的,后接数字表示选择当前行的第几个字段(从1开始计数),$1表示第一个字段,一直到$NF表示最后一个字段,特殊的$0表示整行内容。

2.流程控制

与C语言非常类似,脚本支持如下的流程控制:
这里写图片描述

3.数据类型

存在两种基本的数据类型:数值型和字符串。数值常量可以是整数(3)、小数(3.3)或者科学计数法(.3E-2)。所有的数字都通过浮点数运算方式进行计算:.2E2 == 20这个表达式是true,true使用1.0表示。
字符串常量使用双引号括起来,双引号内可以使用转义字符串,所有转义字符与C语言完全一致。
第三种类型是“数值和字符串混合”类型,也就是同时具有数值也具有字符串值。类型的决定通过表达式上下文来推断:

y = x + 2; z = x "hello world"

上述代码中,如果变量x不是数值,那么先会将x的值转换为数值,使用最长数值前缀的atof函数转换,然后加上2之后保存在y(为数值类型)。z的值为字符串,如果x不是字符串,会先转换为字符串,使用sprintf(CONVFMT,expr)进行转换,除非expr能够使用整数进行表示时CONVFMT为“%d”,否则CONVFMT为一个内置变量且初始值为“%.6g”,之后再进行连接运算。上述隐式转换都不会改变变量x的值。对一个变量进行显式转换可以使用:expr “”(将数值类型变量expr转换为字符串),expr + 0(将字符串expr转换为数值)。
对于布尔上下文,字符串变量当且仅当不为空字符串“”时为true,数值变量当且仅当不为0时为true。
对于表达式 “expr1 op expr2”,如果都是数值字符型或者数值型,那么结果是数值型。如果都是字符串型,那么结果是字符串。如果一个是字符串,另一个是非字符串型,它将转换为字符串,结果是字符串。

4.内置变量

这里写图片描述

5.内置函数

1.字符串函数

这里写图片描述
这里写图片描述

2.算术运算

这里写图片描述


未完待续~_~!!!

0 0