Awk 流程控制
for
if
while 语句
Awk 支持语句作为指令,这些指令必须要放在 { } 里面
单分支:if (条件){编辑指令}
[root@svr5 ~]# awk -F: 'BEGIN{i=0}{if($3<=500){i++}}END{print i}' /etc/passwd
31
类似于 awk -F: '{if($3<=500)print $3}' /etc/passwd |wc -l
双分支结构:if (条件){编辑指令}
else {编辑指令 2}
awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{ j++}}END{print i,j}' /etc/passwd
BEGIN{i=0;j=0}可以省略,因为默认从 0 开始
多分支结构:if (条件){编辑指令}
else {编辑指令 2}
else {编辑指令 3}
[root@svr5 ~]# awk -F: 'BEGIN{i=0;j=0;k=0}{if($7~/bash$/){i++}\
else if($7~/nologin$/){ j++}else{k++}}END{print i,j,k}' /etc/passwd
while 循环求词频 :在某个文档中,某个词出现的频率
[root@ Shell ~]# awk -F: '{i=1;while(i<=NF){if($i~/root/){x++};i++}} END{print
x}' /etc/passwd
脚本写的格式为
i=1
While (i<=NF){
If ($i~/root/)
{x++}
i++}
Awk 数组
统计任何东西出现多少次
Awk ‘X[$1]++ END {print}’
[root@room8pc01]# awk '{IP[$1]++}END{for(i in IP){print IP[i],i}}'
/var/log/httpd/access_log | awk '$1>10{print $2}'
[$1]为数组的下标,是个变量,每次读取的时候读取每行的第一列,如果是$2,每次读
取就读取第二列
(i in IP )
for 循环的是 IP 下标,在到 END 这一步,整体循环已经结束,IP 根据
IP 的下标来确定,每个 IP 出现多少次,然后输出
定义数组 :awk 'BEGINZ{name[0]="jim";name[1]="tom"}'
调用数组:awk
‘{print name[0],name[1]}'
awk中的数组与shell脚本中的数组,不是一个概念!!