awk
用于在linux/unix下对文本和数据进行处理,支持用户自定义函数和动态正则表达式等先进功能。
命令格式:
 awk 'BEGIN{ print “start” } pattern { commend } END{print "end"}' file
awk "BEGIN{ print “start” } pattern { commend } END{print "end"}" file 
awk命令也可以从stdin中读取
构成:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块。这三个部分是可选的。任意一个部分都可以不出现在脚本中。
awk的工作原理:
第一步:执行BEGIN{ commands }语句块中的语句; 
 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 
 第三步:当读至输入流末尾时,执行END{ commands }语句块。
内置变量:
 ARGC               命令行参数个数   
ARGV               命令行参数排列   
ENVIRON            支持队列中系统环境变量的使用 
FILENAME           awk浏览的文件名  
FNR                浏览文件的记录数 
FS                 设置输入域分隔符,等价于命令行 -F选项    
NF                 浏览记录的域的个数   
NR                 已读的记录数 
OFS                输出域分隔符 
ORS                输出记录分隔符   
RS                 控制记录分隔符   
$0                 这个变量包含执行过程中当前行的文本内容    
$1~$n              这个变量包含第1(n)个字段的文本内容 
常用选项:
 -F  fs       指定用于输入数据的列分隔符fs                
-v  var=value   在awk程序执行之前指定一个值value变量给var。这些变量值用于awk程序的BEGIN块    
-f  program-file 指定一个awk程序文件,代替在命令行指定awk指令 
打印指定的列
输出格式:print和printf(可指定格式) 
 - print的使用格式:print item1, item2, … 
 - printf的使用格式:printf format, item1, item2, … 
 $ awk '{print $1,$2}' a.txt 打印a.txt文件的第一列,第二列 
设置字段定界符
 $ awk -F:'{print $NF}' /etc/passwd 或者  
$ awk 'BEGIN{ FS=":" }{ print $NF }' /etc/passwd 
模式
有以下四种模式: 
 一:/正则表达式/:使用通配符的扩展集。 
 二:关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 
 三:模式匹配表达式:用运算符 ~(匹配)和 ~!(不匹配)。 
 四:BEGIN语句块、pattern语句块、END语句块
操作
由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内 
 主要部分:变量或数组赋值,输出命令,内置函数,控制流语句
传参:
- 传外部变量给awk 
 -v 可以将外部值(并非来自stdin)传递给awk:
 var=10000  echo | awk -v variable=$var '{ print variable }' 
- 另一种传递外部变量方法:
 var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 
- 当输入来自于文件时使用:
 awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename 
变量之间用空格分隔作为awk的命令行参数跟随在BEGIN、{}和END语句块之后。
数组应用
awk 中的数组不必提前声明。数组元素用0或空字符串来初始化。
数组的定义
数字做数组索引:
 Array[1]="sun" Array[2]="kai" 
字符串做数组索引:
 Array["first"]="www" Array["last"]="name" 
print Array[1]会打印出sun;print[“last”]会得到name。
读取数组的值:
 { for(item in array) {print array[item]}; }  输出的顺序是随机的    
{ for(i=1;i<=len;i++) {print array[i]}; }    Len是数组的长度 
数组相关函数
得到数组长度:
 awk 'BEGIN{info="it is a test";lens=split(info,tA,""); print length(tA) length(tA),lens;}' 结果为:4 4 
length返回数组长度,split进行分割字符串为数组,也会返回分割得到数组长度。
输出数组内容(无序,有序输出):
awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' 4 test 1 it 2 is 3 aawk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' 1 it 2 is 3 a 4 test
==注意==:数组下标是从1开始,与C数组不一样。
内置函数
主要分以下4种类型:算数函数、字符串函数、其它一般函数、时间函数。
算数函数:
 格式       描述 
sin( x ) 返回 x 的正弦;x 是弧度。    
exp( x ) 返回 x 幂函数。  
log( x ) 返回 x 的自然对数。  
sqrt( x )    返回 x 平方根。     
int( x ) 返回 x 的截断至整数的值。    
rand( )        返回任意数字 n,其中 0 <= n < 1。    
srand( [expr] ) 将 rand 函数的种子值设置为 Expr参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 
字符串函数
split( String, A, [Ere] ) 将String参数指定的参数分割为数组元素A[1],A[2],...,A[n],并返回n变量的值。tolower( String )
返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。toupper( String )
“`返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。