1、BEGIN模块,通常用来改变内建变量的值,如 OFS,RS和FS等,以及打印标题。如:
awk 'BEGIN{FS=" ";OFS="\t";ORS="\n"}{print $1,$2,$3}' file //输入域分隔符为空格,输出域分隔符为tab,记录分隔符为\n。
$awk 'BEGIN{print "TITLE TEST"}
2、END在整个输入文件处理完成后被执行。如
$awk 'END{print "The number of records is" NR}' test //打印被处理的记录数
3、重定向
awk '$1==100{print $1 > "out"}' test.cpp
4、管道
1)awk 'BEGIN{"date" | getline d; print d}' test.cpp //执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。
getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
2)awk 'BEGIN{"date" | getline d;split(d,mon); print mon[2]}' //split函数把变量d转化成数组mon,然后打印数组mon的第二个元素
3)awk 'BEGIN{while("ls"|getline)print}'
循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为BEGIN块在打开输入文件前执行,所以可以忽略输入文件。
4)awk 'BEGIN{printf "what is you name?"; getline name < "/dev/tty"}$1~name{print "Found " name on line ","NR"."}' file
5)awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'
6)可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awk把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。
system函数可以在awk中执行linux的命令。
awk 'BEGIN{system("clear")}'
fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。
5awk '{i=1;while(i<=NF){print NF,$1;i++}}' file
next语句从输入文件中读取一行,然后从头开始执行awk脚本
exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错
6数组
(1)用变量作为数组下标。如:$ awk '{name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test。
输出数组中元素:
{
for (item in arrayname)
{
print arrayname[item]
}
}
delete函数用于删除数组元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test。
7、内建函数
1)sub函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。只替换一次。
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
awk '{ sub(/test/, "mytest"); print }' testfile
2)gsub替换所有。
3)index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。
index(string, substring)
awk '{print index("socket.h","ck")}' file
4)length函数返回记录的字符数
5)子字符串
substr( string, starting position )
substr( string, starting position, length of string )
6)toupper和tolower函数可用于字符串大小间的转换,该功能只在gawk中有效
7)split按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:
split( string, array, field separator )
split( string, array )
awk '{ split( "20:18:00", time, ":" ); print time[2] }'
awk '{if (NF==6){split($5,a,"/");if (a[1]>=a[2])print $0}}' *
8)时间函数systime
9)数学函数sin等[1]
10)自定义函数
function name ( parameter, parameter, … )
{
statements
return expression # the return statement and expression are optional
}
8、默认print $0
9、变量不需要定义就可以直接使用,变量类型可以是数字或字符串。
10、字符串一定要用双引号。
【1】
【2】
【3】