linux+shell编程 笔记 awk

来源:互联网 发布:域名含义 编辑:程序博客网 时间:2024/05/27 20:41

1、awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

 

2、awk中$0代表整行,$n代表分开的列。

 

3、AWK代码结构:通常情况下,awk针对每一个输入行执行一段代码块。但是有时,需要在awk开始处理输入前执行一些数据的初始化(如字段分隔符的设置),对于这样的需求,awk定义了BEGIN代码块(在BEGIN代码块完成awk部分参数的初始化操作);awk 还定义了END代码块,它是在所有的输入都处理完成后awk运行的代码(如做信息统计和数据打印)。

awk的运行可看成3部分组成:处理输入前的初始化、处理输入过程、处理完所有输入后的扫尾工作。

 

BEGIN实例:

BEGIN{   FS=":"}{   print "USER: "$1 "\tSHELL: "$7}

 

END实例:

BEGIN{   print "How many people with pan?"}/pan/{++a}     (模式匹配操作,/正则表达式/{匹配后的操作})END{   print "'pan' appears " a " times."}

 

4、变量

awk中有两种变量:内建变量和用户自定义变量

awk变量使用无需先声明,在第一次使用该变量的时候,自动建立变量。awk的变量在建立时的初始值是空字符串,但是当需要数值时,可以视为0。即awk会自动将字符串转换为数值进行计算。【awk的变量名称是大小写敏感的。】

内建变量:

FILENAME:当前输入文件的名称

FNR:当前输入文件的记录数

FS:字段分割符(默认为空格)

NF:当前记录的字段数

NR:当前记录数

OFS:输出字段分隔符

ORS:输出记录分割符(默认为换行符)

RS:输入记录分隔符(默认为换行符)

ERRNO:最后一耳光系统错误的描述

ENVIRON:环境变量关联数组

 

5、数组

awk允许在数组名称之后,以方括号将任意数字或字符串表达式括起来作为索引。

awk的数组也无需声明,数组的存储空间在引用新元素时会自动增长,数组的存储空间是稀疏的。

当元素不再需要时,其存储空间可以回收再利用。delete array[index]会从数组中删除元素,而delete array会删除array数组中的所有元素。(注:delete删除数组元素时,不会删除它的名称。

 

6、环境变量

awk支持直接对系统环境变量的访问,通过ENVIRON数组。

awk 'BEGIN{print ENVIRON["HOME"];print ENVIRON["PATH"]}'


7、用户自定义函数

所有用于函数体内部且未出现在参数列表中的变量,awk都将其视为全局性变量。

awk允许被调用函数中的参数比函数定义里所申明的参数还要少,这样额外的参数被视为局部变量。对于这类变量,一般将它列在函数参数列表中,并且在自首前置一些额外的空白。这个额外的参数如同awk里的其它变量一样吗,在函数内容中被初始化空字符串。

值传递和地址传递:在C语言中,因为有指针操作符和取址操作符,所以可以直接对变量进行地址传递。在awk中的数组则默认认为是地址传递,而普通变量则为值传递。

// 地址传递,函数定义function swap(array, temp){    temp = array[1]    array[1] = array[2]    array[2] = temp}{    array[1] = 2    array[2] = 3    printf("array[1]: %d------array[2]: %d\n", array[1], array[2])    swap(array)    printf("array[1]: %d------array[2]: %d\n", array[1], array[2])}