您的位置:首页 > 其它

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

2014-11-07 17:59 399 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: