Awk高级应用

IF语句条件判断

#if语法:
if(表达式)
动作1
else
动作2

#if语法格式2:
if(表达式) 动作1;else 动作2

[root@server0 ~]# df | grep boot | awk '{print $4}'
387300
[root@server0 ~]# df | grep boot | awk '{if($4<200)print "Error!!";else print "OK"}'
OK
[root@server0 ~]# df | grep boot | awk '{if($4<2000000)print "Error!!";else print "OK"}'
Error!!
[root@server0 ~]# 

while语句循环

while语法格式1:
while(条件)
动作
`x=1
while (x<10){
	print $x
	x++
}`


[root@server0 ~]# awk 'i=1 {} BEGIN {while (i<=10){print i;++i}}'

#while循环语法格式2
do	
动作
while (条件)


[root@server0 ~]# awk 'BEGIN {do {++x;print x}while (x<=10)}'


[root@server0 ~]#  awk -F: '{i=1;while(i<=NF){print i":"$i;i++}}' passwd.bak 

for语句循环

for (变量;条件;计数器)
	动作

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

[root@server0 ~]# awk -F: '{for(i=1;i<=NF;i++){print i":"$i}}' passwd.bak


[root@server0 ~]# awk -F: '{a[$7]++}END{for(i in a)if(i !=""){print i":"a[i]}}' passwd.bak 
/bin/sync:1
/bin/bash:2
/sbin/nologin:33
/sbin/halt:1
/bin/false:1
/sbin/shutdown:1
[root@server0 ~]# 

##a[$7] 将$7作为数组的key,然后统计个数
##统计完成后遍历,for,判断i是否在数据a中,如果在则打印a[i]值,个数

Break与continue

break:直接跳出循环
continue:终止当前循环

#
打印1-4
for (i-1;i<=10;i++){
	if (i=5)
		break
	print i	
}

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

打印1-4,6-10
for (i=1;i<=10;i++){
	if(i=5)
		continue
	print i
}


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

函数

1.rand()函数
作用:产生0-1之间的浮点型的随机数,rand产生随机数时需要通过srand()
设置一个参数,否则单独的rand()每次产生的随机数相同
[root@server0 ~]# awk 'BEGIN{print rand();srand();print srand()}'


2.gsub(x,y,z)函数
	在字串z中使用字符y替换与正则表达式x相匹配的第一个字串,z默认为$0
3.sub(x,y,z)函数
	在字串z中使用字符y替换与正则表达式x相匹配的第一个字串,z默认为$0


	[root@server0 ~]# awk -F: 'gsub(/root/,"hello",$0){print $0}' passwd.bak 
	hello:x:0:0:hello:/hello:/bin/bash
	operator:x:11:0:operator:/hello:/sbin/nologin
	[root@server0 ~]# 

	[root@server0 ~]# awk -F: 'sub(/root/,"hello",$0){print $0}' passwd.bak 
	hello:x:0:0:root:/root:/bin/bash
	operator:x:11:0:operator:/hello:/sbin/nologin
	[root@server0 ~]# 

	
	#sub相当于sed中的s///,gsub相当于sed中的s///g.


4.length(z)函数
	计算返回字串z的长度

	[root@server0 ~]# awk '{print length()}' test.txt

5.getline函数
	从输入中读取下一行内容

	[root@server0 ~]# df -h | awk 'BEGIN {print "Disk FREE"}{if(NF==1){getline;print $3};if(NF==6)print $4}'