linux awk 学习笔记一(print 、变量、数组)

文章摘抄至 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

相关推荐