awk概述:
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,
或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,
是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。
awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,
并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),
如果没有指定模式,则所有被操作所指定的行都被处理。
相较于sed 常常作用于一整个行的处理,awk 则比较倾向于一行当中分成数个『字段』来处理。
因此,awk 相当的适合处理小型的数据数据处理。
语法形式
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
常用命令选项
-F fs fs指定输入分隔符,fs可以实字符串或者正则表达式,如 -F :
-v var=value 赋值一个用户定义变量,将外部变量传递给awk。
-f scripfile 从脚本文件转中读取awk命令。
awk脚本是由模式和操作组成的
模式可以是以下任意一个:
•/正则表达式/:使用通配符的扩展集。
•关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串 或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
•模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
•模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
•BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在 这里设置全局变量。
•END:让用户在最后一条输入记录被读取之后发生的动作。
操作:
操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开, 并位于大括号内。主要有四部份:
•变量或数组赋值
•输出命令
•内置函数
•控制流命令
awk脚本基本结构
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end"}' file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、
END语句块3部分组成,这三个部分是可选的。任意一 个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中。
awk内置变量(预定义变量)
$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字 段。
$0 这个变量包含执行过程中当前行的文本内容。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)
NF 表示字段数,在执行过程中对应于当前的字段数
NR 表示记录数,在执行过程中对应于当前的行号
OFS 输出字段分隔符(默认值是一个空格)
RS 记录分隔符(默认是一个换行符)
ORS 输出记录分隔符(默认值是一个换行符)
实例:
#打印每一行的第二和第三个字段:
awk '{ print $1,$3 }' file
#统计文件中的行数
awk 'END{ print NR }' file
#借助-v选项,可以将外部值(并非来自stdin)传递给awk
var=100
echo | awk -v variable=$var '{ print variable }'
#另一种传递外部变量的方法
var1="abc"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
awk运算与判断
例:
awk 'BEGIN{a=1,b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0 1
#正则运算符
awk 'BEGIN{a="100test";if(a ~ /^100*/){print "ok";}}'
ok
#关系运算符
awk 'BEGIN{a=11;if(a >= 9){print "ok";}}'
ok
#输出到一个文件
echo | awk '{printf("hello word") > "datafile"}'
#-F 设置字段定界符(分隔符)
awk -F : '{print $NF }' /etc/passwd
或
awk 'BEGIN{ FS=":"}{ print $NF }' /etc/passwd
数组的定义
#数字做数组索引
Array[1]="sun"
#字符串做数组索引
Array["first"]="name"
#读取数组的值
{for(item in array){print array[item]};} #输出的顺序是随机的
{for(i=1;i<=len;i++){print array[i]};} #len是数组长度