shell之awk深入学习

awk的应用环境:文本处理和报表生成

awk的原理:

awk '{print $0}' /etc/passwd

执行awk时,它依次对/etc/passwd中的每一行执行print命令。所有输出发送到stdout,所有得到与执行cat /etc/passwd完全相同。

BEGIN和END模块:

BEGIN:在执行循环每行文本之前执行的命令,用于初始化FS变量(变量分隔符)、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

END:awk 在处理了输入文本中所有行之后执行这个块。通常end快用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

awk的运算符:

#awk赋值运算
[root@server ~]# awk 'BEGIN{a=5;a+=5;print a}'
10
#逻辑运算
[root@server ~]# awk 'BEGIN{a=5;b=2;print(a>2&&b>1,a=1||b>1)}'
1 1
#awk正则运算符
[root@server ~]# awk 'BEGIN{a="100testaaaagje";if(a~/100/){print "ok"}}'
ok
[root@server ~]# echo |awk 'BEGIN{a="100testaaa"}a~/100/{print "ok"}'
ok
#关系运算符
[root@server ~]# awk 'BEGIN{a=23;if(a>10){print "ok"}}' 
ok
[root@server ~]# awk 'BEGIN{a=11;b=23;if(a<b){print "it is ok"}}'
it is ok
#算数运算符
[root@server ~]# awk 'BEGIN{a=5;print a++,++a}'
5 7
[root@server ~]# awk 'BEGIN{a="20b4";print a++,++a}'
20 22
#其它运算:三目运算
[root@server ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[root@server ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err

常用awk内置变量

#字段分隔符FS
[root@server ~]# cat /etc/passwd|awk 'BEGIN{FS=":"}{print $1}'
#FS="\t"   一个或者多个Tab分隔
#FS="[[:space:]+]"   一个或者多个空格,默认的
#FS="[" ":]+"    一个或者多个空格或者:分隔

#字符数量NF(number filed)   #当字段数为7时,打印当前行
[root@server ~]# cat /etc/passwd|awk 'BEGIN{FS=":"}{if(NF==7){print $0}}'
#记录数量NR(numer row)   #当行数为7时,打印当前行
[root@server ~]# cat /etc/passwd|awk 'BEGIN{FS=":"}{if(NR==7){print $0}}'
#RS记录分隔符变量
#将 FS 设置成"\n"告诉 awk 每个字段都占据一行。通过将 RS 设置成"",还会告诉 awk 每个地址记录都由空白行分隔

#OFS输出字段分隔符
[root@server awk]# cat /etc/passwd|awk 'BEGIN{FS=":";OFS="##"}{print $1,$2}'
#ORS输出记录分隔符

AWK正则:

 

 正则应用:

 

#规则表达式
#awk '/REG/{action}'  file,/REG/为正则表达式,可以将$0中,满足条件的的记录送入到action进行处理
[root@server awk]# cat /etc/passwd|awk 'BEGIN{FS=":"}/^a/{print $1}'

#布尔表达式
#awk '布尔表达式{action}' file   仅当对前面的布尔表达式求值为真是,awk才执行代码块
[root@server awk]# cat /etc/passwd|awk 'BEGIN{FS=":"}$1=="root"{print $0}'           
root:x:0:0:root:/root:/bin/bash
等同于
[root@server awk]# cat /etc/passwd|awk 'BEGIN{FS=":"}{if($1=="root"){print $0}}'          
root:x:0:0:root:/root:/bin/bash

 

awk的if、循环和数组

if条件语句:

循环结构:

#do...while 此循环至少执行一次
{
    count=1
    do{
        print "this is in the do while"
    }while(count !=1)
}
while(1){
    print "这是一个死循环"
}
#for循环
for(x=1;x<=8;x++){
    print x
}

for(i in a){
    print i
}

数组的使用:

#awk数组应用
#统计用户的shell类型
[root@server awk]# cat /etc/passwd|awk 'BEGIN{FS=":"}{a[$7]+=1}END{for(i in a)print(i,a[i])}'         
/bin/sync 1
/bin/bash 12
/sbin/nologin 49
/sbin/halt 1
/bin/false 2
/sbin/shutdown 1

 

 常用字符串函数:

应用场景:

 

posted @ 2018-03-22 11:39  大梦初醒lf  阅读(314)  评论(0)    收藏  举报