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 a
awk '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 参数指定的字符串,字符串中每个小写字符将更改为大写。