文章摘抄至 http://www.cnblogs.com/image-eye/archive/2011/10/31/2230280.html
先了解awk 的工作原理:
1. AWK读取输入文件一次一行。
2. 对于每一行,它匹配在给定的顺序模式,如果匹配,执行相应的动作。
3. 如果没有模式匹配,将执行任何行动。
4. 在上面的语法,无论是搜索模式,或行动是可选的,但不能同时。
5. 如果没有给出搜索模式,然后awk要执行每一行输入给定的行动。
6. 如果没有给出动作,打印,这是默认的操作与模式相匹配的所有行。
7. 空出的任何行动括号什么都不做。它不会执行默认的打印操作。
8. 中的每个行动的声明应该用分号分隔。
例子说明
#原始文本数据 $cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000 #查看包含Thomas字段的数据,注意$0代表当前行 [root@eccs_web ~]# awk '/Thomas/{print $0}' employee.txt 100 Thomas Manager Sales $5,000 #默认情况下的awk打印文件的每一行。 [root@eccs_web ~]# awk '/Thomas/{print}' employee.txt 100 Thomas Manager Sales $5,000 #显示根据空格分段之后的第2列和第5列数据,数据是从第1列开始,第0列代表当前行 [root@eccs_web ~]# awk '{print $2,$5;}' employee.txt Thomas $5,000 Jason $5,500 Sanjay $7,000 Nisha $9,500 Randy $6,000 #打印制表符 [root@eccs_web ~]# awk 'BEGIN{ print "Name\tDesignation\tDepartment\tSalary";} > {print $2,"\t",$3,"\t",$4,"\t",$NF;} > END{print "Report Generated\n---------------"; > }' employee.txt Name Designation Department Salary Thomas Manager Sales $5,000 Jason Developer Technology $5,500 Sanjay Sysadmin Technology $7,000 Nisha Manager Marketing $9,500 Randy DBA Technology $6,000 Report Generated --------------- #正则表达式匹配 [root@eccs_web ~]# awk '$4~/Technology/' employee.txt 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 500 Randy DBA Technology $6,000
变量
1、内置变量
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
例子
内置变量FS,表示“输入字段分隔符”
[root@auc-test2 1]# gawk 'BEGIN{FS=":"} {print $1,$2,$3}' /etc/passwd root x 0 bin x 1 daemon x 2 adm x 3
内置变量OFS,表示“输出字段分隔符”
[root@auc-test2 1]# gawk 'BEGIN{FS=":";OFS="-"} {print $1,$2,$3}' /etc/passwd root-x-0 bin-x-1 daemon-x-2
2、gawk数据变量
ARGC 命令行参数个数 AGRV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,同- F选项 NF 浏览记录的域个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
例子
[root@auc-test2 1]# gawk 'BEGIN{print ENVIRON["HOME"];print ENVIRON["PATH"]}' /root /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
3、自定义变量
例子
[root@eccs_web huangbiao]# awk 'BEGIN{test="hello awk";print test}' hello awk [root@auc-test2 1]# gawk 'BEGIN{x=4;x=x*2+3;print x}' 11 #执行脚本文件 [root@auc-test2 tmp]# cat script1 BEGIN{FS=":"} {print $n} [root@auc-test2 tmp]# gawk -f script1 n=5 /etc/passwd root bin
数组
1使用字符串作为数组坐标
[root@auc-test2 tmp]# gawk 'BEGIN{var["name"]="huangbiao";print var["name"]}' huangbiao
2使用数字作为数组坐标
[root@auc-test2 tmp]# gawk 'BEGIN{var[1]=34;var[2]=3;total=var[1]+var[2];print total}' 37
3数组遍历
[root@auc-test2 tmp]# gawk 'BEGIN{ > var["a"]=1 > var["b"]=2 > var["c"]=3 > var["d"]=4 > for(test in var){ > print "Index:",test,"- Value:",var[test] > } > }' Index: a - Value: 1 Index: b - Value: 2 Index: c - Value: 3 Index: d - Value: 4
等价于
[root@auc-test2 tmp]# gawk 'BEGIN{var["a"]=1;var["b"]=2;var["c"]=3;var["d"]=4;for(test in var){print "Index:",test,"- Value:",var[test]}}' Index: a - Value: 1 Index: b - Value: 2 Index: c - Value: 3 Index: d - Value: 4
备注:换行需要”;”来隔开,awk里面的代码与shell编程的格式不一致,但是与传统的java或者javascript方式很相似,不需要太多的在意空格,字符串连接需要注意。
4删除数组
[root@auc-test2 tmp]# gawk 'BEGIN{var["a"]=1;var["b"]=2;var["c"]=3;var["d"]=4;for(test in var){print "Index:",test,"- Value:",var[test]};delete var["b"];print "------";for(test in var){print "Index:",test,"- Value:",var[test]}}' Index: a - Value: 1 Index: b - Value: 2 Index: c - Value: 3 Index: d - Value: 4 ------ Index: a - Value: 1 Index: c - Value: 3 Index: d - Value: 4