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