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}'