1.使用正则处理条件
-输出以bash结尾的完整记录(输出整行)
#awk -F: '/bash$/{print}' /etc/passwd
-输出包含root的行
#awk -F: '/root/' /etc/passwd (print可以不写)
-输出root或者he账号的用户名和UID信息
#awk -F: '/^(root|tom)/{print $1,$3}'
-输出账户的名称包含root的行,(第一列包含oo)
#awk -F: '$1~/oo/' /etc/passwd
-输出登录shell不以nolocal结尾的用户名和登录shell信息
#awk -F: '$7!~/nolocal/{print $1,$7}'
!~ : 取反匹配
2.使用数值/字符串比较条件
比较符号:
== 等于 != 不等于
< > >= <=
-输出账户UID大于等于1000的账户名和UID信息
#awk -F: '$3>=1000{print $1,$3}' /etc/passwd
-输出第三行
#awk -F: 'NR==3{print}' /etc/passwd
-输出UID小于10的账户名和UID信息
#awk -F: '$3<10{print $1,$3}' /etc/passwd
-输出用户名root的行
#awk -F: '$1=="root"' /etc/passwd
-输出UID大于10且小于20的账户信息
#awk -F: '$3>10 && $3<20' /etc/passwd
-输出UID大于1000或者小于10 的账户信息
#awk -F: '$3>1000 || $3<10' /etc/passwd
数学运算:
#awk 'BEGIN{x++;print x}'
1
#awk 'BEGIN{x=8;print x+=2}'
10
#awk 'BEGIN{x=8;x--;print}'
7
#awk 'BEGIN{print 2+3}'
5
#awk 'BEGIN{print 2*3}'
6
#awk 'BEGIN{print 23%8}'
7
-统计200以内3的倍数的数量
#seq 200 | awk '$1%3==0{i++} END{print i}'
for i in `seq 200`
do
[ $[ i % 3 ] -eq 0 ] && j++
done
echo $j
awk过滤if分支结构:
1.单分之
-统计UID小于或等于1000的用户数量
#awk -F: '{if($3>1000){i++} END{print i}'
-统计登录shell是/bin/bash的用户
#awk -F: '{if($7~/bash$/){i++}} END{print i}' /etc/passwd
2.双分之
-分别统计UID小于或等于1000、UID大于1000的用户个数
#awk -F: '{if($3>=1000){i++}else{j++}} END{print i,j}' /etc/passwd
-统计登录shell是/bin/bash的用户和登录shell不是/bin/bash的用户的个数
#awk -F: '{if($7~/bash$/){i++}else{j++}} END{}print i,j' /etc/passwd
awk 数组:
数组是一个可以储存多个值的变量
定义数组:
数组名[下标]=元素值
调用:数组名[下标]
a=[1,2,“abc”]
a[2]=abc //下标从0开始
遍历数组的用法: for (变量 in 数组名){print 数组名 [变量]}
-定义一个数组并调用
#awk 'BEGIN{a[0]=11;a[1]=88;print a[0],a[2]}'
88 11
#awk 'BEGIN{a++;print a}'
1
#awk 'BEGIN{a0++;print a0}'
1
#awk 'BEGIN{a[0]++;print a[0]}'
1
遍历数组并输出下标和对应的值
#awk 'BEGIN{a[0]=00;a[1]=11;a[2]=22;for(i in a){print i,a[i]}}'
0 00
1 11
2 22
-下标还可以为字符串,字符串记得加双引号
#awk 'BEGIN{a["dachui"]=0;print a["dachui"]}'
0
awk实例:
1.分析web日志中访问量的排名,要求输出客户端 访问次数 按照访问次数从小到大输出