Awk 编程语言 变量 函数 流程控制 数组
单独使用时,主要用来对数据做统计
统计网站服务 器当天的访问量
统计网站服务 器在上午9:00-12:00时间 段的访问 量
统计系统内建用户数据、系统外建用户数
统计某个服务在某时间段内对CPU、内存的使用率
和shell脚本一起使用时,获取数据给shell程序处理
命令格式
Awk [选项] '动作' 文件列表
命令 |Awk [选项] '动作'
-F "分割符号" 指定列的分割符号
Awk默认使用 空格 或 \tab 做为列的分割符号
如何处理数据
以行为处理单位,对数据逐行处理完当前行处理下一行,直到白马 所有行处理完为止,默认把当前行的处理结果输出到屏幕上
Awk变量 内置变量、自定义变量
内置变量——在调用内置变量时,不需要加 "",输入描述信息时,描述信息加""
$0 保存当前处理行的内容
FILENAME 保存当前处理文件的文件名
Awk '{ print FILENAME }' file1 file2
NR 保存当前处理行的行数
FNR 当前处理行在文件中的行数
Awk '{ print FNR,NR }' file1 file2
NF 使用指定的分割符号分割后,行的列数
Awk -F ":" '{ print NF }' file1
$1……$N 使用指定的分割符号 分割后,对应的值
Df -h |grep /$ |awk '{print $1,$2}'
FS 保存awk分割感恩节时,使用的分割符号,默认值是 空格 或TAB键
[root@localhost ~]# head -3 /etc/passwd|awk 'BEGIN{FS=":";print "user\tuid\thome"}{print $1"\t",$3"\t",$6}END{print "this is "NR"..."}
Awk自定义变量
Head /etc/passwd | awk '{age=10;name="jim";print name,age}'
Head /etc/passwd | awk '{print name,age}'
Awk调用shell自定义变量
X=100
Head -1 /etc/passwd|awk -v a=$X'{print a}'
Y=200
Head -1 /etc/passwd|awk -v a=$X -v b=$Y'{print a,b}'
Awk调用shell系统环境变量
ENVIRON(数组类型的内置变量)
ENVIRON["系统环境变量名"]
主机名 [root@localhost ~]# head -1 /etc/passwd|awk '{print ENVIRON["HOSTNAME"]}'
用户名 [root@localhost ~]# head -1 /etc/passwd|awk '{print ENVIRON["USER"]}'
输出3个用户的用户名、UID、家目录
[root@localhost ~]# head -3 /etc/passwd|awk -F ":" '{print $1"\t",$3,"\t"$6}'|sed '1iusername uid \thome'
Awk处理数据的顺序
行前处理 BEGIN{ } awk没读入之前执行的处理动作
行处理 { } 处理文件的每一行
行后处理 END{ } awk处理完所有行之后执行的动作
[root@localhost ~]# head -3 /etc/passwd|awk -F ":" 'BEGIN{print "user\tuid\thome"}{print $1"\t",$3"\t",$6}END{print "this is "NR"..."}'
Awk处理条件
Awk '条件{动作}' 文件名
条件的表示方式
数值比较 == > >= < <= !=
[root@localhost ~]# awk 'FNR==1{print $0}' /etc/passwd
[root@localhost ~]# awk -F ":" '$3<=10{print $1,$3}' /etc/passwd
[root@localhost ~]# awk -F ":" '$3==500{print $0}' /etc/passwd
[root@localhost ~]# awk -F ":" '$3!=0{print $0}' /etc/passwd
字符比较 == !=
[root@localhost ~]# awk -F ":" '$1=="root"{print $0}' /etc/passwd
逻辑比较 多个条件
逻辑与 && 多个条件要同时成立
逻辑或 || 多个条件只要有一个条件成立就可以
逻辑非 ! 取反
/正则表达式/
匹配 ~
不匹配 !~
值 ~ /正则表达式/
把系统 账户的UID是3位数用户信息输出
[root@localhost ~]# awk -F ":" '$3>=100 && $3<=999 {print $0}' /etc/passwd
[root@localhost ~]# awk -F ":" '$3~/^...$/{print $0}' /etc/passwd
把系统用户名包含数字的用户的名字和家目录输出
[root@localhost ~]# awk -F ":" '$1~/[0-9]/{print $1,$6}' /etc/passwd
输出用户名公由4个字母组成的用户名输出
[root@localhost ~]# awk -F ":" '$1~/^[a-Z][a-Z][a-Z][a-Z]$/{print $1,$6}' /etc/passwd
Awk运算符号——和SHELL里面一样的
使用awk输出文件中的偶数行
使用awk输出文件中的奇数行
统计UID号小于500的用户个数
[root@localhost ~]# awk -F ":" 'BGEIN{i=0}$3<500{i++}END{print i}' /etc/passwd
统计UID号大于500的用户个数
[root@localhost ~]# awk -F ":" 'BGEIN{i=0}$3>=500{i++}END{print i}' /etc/passwd
统计有多少用户不能登录系统
[root@localhost ~]# awk -F ":" '$7=="/sbin/nologin"{i++}END{print i}' /etc/passwd
输出39到69之间的偶数 并统计偶数的个数
[root@localhost ~]# seq 39 69|awk '$0%2==0{print $0;i++}END{print i}'
输出39到69之间,是数字7倍数或是含数字7的数输出
[root@localhost ~]# seq 39 69|awk '$0%7==0 || $0 ~ /7/{print $0}'
Awk流程控制——选择结构 循环结构
选择结构
单分支
If (条件表达式) {动作}
[root@localhost ~]# awk -F ":" '{ if($3<500){i++} } END{print i}' /etc/passwd
双分支
If (条件表达式) {动作} else {动作}
[root@localhost ~]# awk -F ":" '{ if($3<500){i++}else{j++} } END{print i,j}' /etc/passwd
多分支
If(条件1){指令} else if(条件2){指令} else if(条件3){指令}.. .. else{指令N}
Awk循环结构
While(条件判断){循环体}
Do..while循环结构 先执行循环体再判断条件
Do{循环体}while(条件判断)
For循环结构
For(赋初值;条件;步长){循环体}
Awk数组
变量数组元素的循环结构
For(变量名 in 数组名){循环体}
[root@localhost shell]# awk -F ":" '{a[$1]++}END{for(i in a){print i,a[i]}}' a|sort -rk 4