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


常用字符串函数:


应用场景:


浙公网安备 33010602011771号