awk用法(二) ---程序语言特性

1 内建变量(built-in) 常用

FS   输入字段分隔符  默认空白 由选项 -F 改变 或者重新赋值FS

OFS  输出字段分隔符  默认空格,改变可以重新赋值

FILEWIDTHS   由空格隔开iade定义了每个字段的宽度,即取代FS 有字段长度来决定如何分割字段的

FNR 当前数据文件中的数据行数

NR 数据文件中的字段总数

NF 已处理的输入数据行数目

 

实例一 : FS与OFS的用法

[root@shiyan ~]# echo  "data1,date2,date3" | awk 'BEGIN{FS=",";OFS="--"} {print $1,$2,$3}'

data1--date2--date3

对比

[root@shiyan ~]# echo  "data1,date2,date3" | awk 'BEGIN{FS=","} {print $1,$2,$3}'

data1 date2 date3

 

实例二: FILEDWIDTHS 的用法

分离电话号码

[root@shiyan ~]# echo "02164300980" | gawk 'BEGIN{FIELDWIDTHS="3 8"}{print $1, $2}'

021 64300980

[root@shiyan ~]# echo "02164300980" | gawk 'BEGIN{FIELDWIDTHS="3 8";OFS="-"}{print $1, $2}'

021-64300980

 

实例三 : NF  NR  RNR 的区别

[root@shiyan ~]# echo  "data1 date2 date3" | awk '{print NF}'

3

NF 好理解即处理的这条记录有多少个 字段

[root@shiyan ~]# echo  -e "data1 date2 date3\ndate4 date5" | awk '{print NF}'

3

2

区别NR和FNR在于是否时多个输入文件,如果是处理一个文件则 两则意思相等

如果处理的数据文件为二个或者多个 则 FNR表示当前正在处理的文件中已经处理的记录个数

[root@shiyan ~]# awk '{print NR,FNR}' /etc/issue /etc/issue

1 1

2 2

3 3

4 1

5 2

6 3

解释  NR会将已经的记录行累加下去,不论记录行来自哪个文件,而FNR当前正在处理的文件中处理的记录

 

实例四: awk处理数组与遍历数组

数组变量赋值 var[index]= element ,如果未定义 则默认为空,索引值可以为任何值如 字符

[root@shiyan ~]# awk 'BEGIN{var[1] = 3;var[2] = 4;total = var[1] + var[2];print total}'

7

遍历数组用法  

for (var in array)

{

   statement

}

注意此处 for语句会将每次关联到数组的array的下一索引值赋给 变量var 而不是数据元素值

[root@shiyan ~]# awk 'BEGIN{var[1] = 3;var[2] = 4; for (i in var) {print "Index:",i,"value:",var[i]} }'

Index: 1 value: 3

Index: 2 value: 4

 

[root@shiyan ~]# awk 'BEGIN{var["v1"] = 3;var["v2"] = 4; for (i in var) {print "Index:",i,"value:",var[i]} }'

Index: v1 value: 3

Index: v2 value: 4

此处索引值为 字符

 

如统计 tcp的链接情况

[root@shiyan ~]# netstat -tan | awk '/tcp/{state[$6]++}END{for (var in state) {print var, state[var]}}'

TIME_WAIT 1

ESTABLISHED 2

LISTEN 18

 

实例五: awk的匹配与不匹配 

 

[root@shiyan ~]# awk -F : ' /^root/{print $1}' /etc/passwd 

处理 匹配开始为root的行

[root@shiyan ~]# awk -F : '~ /root/{print $1}' /etc/passwd

处理 不匹配root 的行

[root@shiyan ~]# awk -F : '$3 > 500 {print $1,$3}' /etc/passwd

nfsnobody 65534

zabbix 501

处理第三个字段(uid)大于500的用户和uid

 

实例六: awk 支持if

if (condition) statement [ else statement ]

[root@shiyan ~]# awk -F : '{if ($3 >500){print $1,$3}}' /etc/passwd

nfsnobody 65534

zabbix 501

 

实例七: awk 支持while

 while (condition) statement

 do statement while (condition)

[root@shiyan ~]# awk -F : '{while($3==501){print $1,$3;break}}' /etc/passwd

zabbix 501

 

实例八:  awk 支持for循环

              for (expr1; expr2; expr3) statement

              for (var in array) statement

  

[root@shiyan ~]# awk 'BEGIN{for(i=1;i<5;i++){print i}}'

1

2

3

4

 

 

posted @ 2014-11-07 17:59  小小龟侠  阅读(450)  评论(0编辑  收藏  举报