一: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 的变量:字段变量:  $0:代表整行记录,$1,$2,分别表示$0这行中的第一个字段和第二个字段

 内置变量  :NF表示$0这行的字段数目,NR表示awk已经读入行的数目,FILENAME  awk表示正在处理的文件名。FNR:各文件分别计数。ARVG:数组保存命令本身这个字符,ARGV:保存命令中参数的个数

RS:输入时行分隔符,OFS:输出时字段分隔符,ORS:输出时行分割符号。

三: awk的工作原理:awk是每次读取文件中的一行处理,默认将文件以空格或者tab分为几个字段,每一个字段称为一个域。

自动更新(Update)相关的内建变量之值 : NF, NR, $

依次执行程序中 所有  Pattern { Actions } 指令.

当执行完程序中所有 Pattern { Actions } 若数据文件中还有未读取的数据则反复执行步骤1到步骤4.

awk会自动重复进行上述4个步骤使用者不须于程序中编写这个循环 (Loop).

四:awk的命令使用:

    1.awk的printf命令使用格式:printf format,item1,item2,...

  要点:要指定format,不会自动换行,如需换行需要加上\n。format为后面的每个item指定格式

format格式的可以项%后跟一个字符,常用选项如下:

%c:显示字符的ASCII码;

%d,%i:十进制整数;

%e,%E: 科学计数法显示数据

%g,%G:以科学计数法格式或浮点数格式显示数据

%f:显示浮点数

%u:显示无符号整数

%%:显示%自身;

修饰符:

#:显示宽度

-:左对齐,默认右对齐

+:显示数字的行号

.#:取值精度

实例:

wKiom1P4UdiR40ntAABgCEep8uc697.jpg

表示两个字段分别以宽度20和3输出,并且第二个字段是左对齐

2.awk的操作符:

算术操作符:

x+y

x-y

x*y

x/y

x**y, x^y : x的y次方

x%y

-x:负值

+x:转换为数值

字符串操作符:连接运算

赋值操作符:= += -= /=  ++ -- 

比较操作符:>= , <= ,> , < ,~,!~

逻辑操作符 && || 

条件表达式:

selector?if-true-expression:if-false-expression

实例:

wKioL1P4WQyjsiaEAAB6HaT7Q88212.jpg

函数调用:

function_name(argu1,argu2)

3.控制语句(此前bash 中的控制语句在这里都可以使用):

  1. if   else  控制语句 这里if 后面只需要一个括号

实例:

wKiom1P4WyrwImB1AACKN3sE1sc649.jpg

2.while 语句:

实例:

wKiom1P4Xo7D8ufZAABdLTMEF0Y843.jpg

3.do while 循环,同上只不过是在判定条件之前先执行一次

4.for 循环:

实例:

wKioL1P4YjyjNXbkAABlp_drhHU343.jpg

注意:这里的for语句就不需要两个()这是与bash的不同之处

for循环可以遍历数组:

语法:for (index in array) {for body}:这种遍历格式是遍历数组中的下标,而非数组中的元素

awk程序中允许使用字符串当做数组的下标(index),下表作为索引,当下表变化时,索引也随之变化:如上index表示array中的索引

将字符作为数组中的索引我们可以实现统计某个索引出现的次数

如果一个数组元素的值事先不存在,awk会自动创建此元素并将其初始化为空串,因此要判断一个数组是否存在元素要用index inarray 这种格式

5.case 语句

语法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}

6.循环控制:

continue:

break:

7.next:提前结束本行统计提前进入下一行。

实例:显示passwd 文件中奇数行的用户

wKiom1P4alSReHyQAABbuVtAXxY999.jpg

8.awk可以调用程序文件:

实例:vim a.awk;

BEGIN {

while ( "who" | getline ) n++

print n

}

用awk -f a.awk

即可得到当前登录中端的个数。

9.awk中的内置函数:

split(string,array[,fieldsep[,seps]]):

功能是将string 以 fieldsep为分隔符将其分割并保存在array数组中,下表从一开始

length(string):返回给定字符串的长度

substr(string,start[,length])

功能是将从string中取子串,从start为起始位置为取length长度的子串;