文章摘抄至 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支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
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