6、常用ACTION (1) EXPRESSIONS:例如变量赋值 (2) Control Statements:控制语句,如if, while等; (3) Compound Statements:复合语句 (4) input statements (5) output statements 7、控制语句 if (condition) { statements } [else { statement }] while (condition) { statements } do statement while (condition) for(expr1;expr2;expr3) { statements } for(var in array) { statements } switch (expression) {case VALUE or /REGEXP/: statement; ...; default: statementN} break continue delete array[index] delete array exit [ expression ] { statements } 7.1 if-else 语法:if (condition) statement [ else statement ] if (condition) {statements} [else {statements}]~]# awk -F: '{if ($3>=500) print $1,$3}' /etc/passwd ~]# awk -F: '{if ($3>=500) print $1,$3}' /etc/passwd nfsnobody 65534 mark 500 mark1 501 fedora 502 apapche 503 system 504 [root@www ~]#~]# awk '{if (NF>=6) print NF,$0}' /etc/rc.d/rc.sysinit ~]# awk -F: '{if ($3>=500) {print $1,"is a common user"} else {print $1,"is a sysadmin or sysuser"}}' /etc/passwd使用场景:对awk取得的整行或行中的字段做条件判断;7.2 while循环 语法:while (condition) statement while (condition) {statements}条件为“真”时循环,为“假”时退出循环;使用场景:通常用于在当前行的各字段间进行循环;~]# awk '{i=1;while(i<=NF){if (length($i)>=6) {print $i};i++}}' /etc/issue 7.3 do-while循环 语法:do statement while (condition) do {statements} while (condtion) 意义:至少执行一次循环体 7.4 for循环 语法:for (expr1;expr2;expr3) statement for (expr1;expr2;expr3) {statements}for (variable assignment;codition;iteration process) {for-body}# awk '{for(i=1;i<=NF;i++){if(length($i)>=6) print $i}}' /etc/issue第二种用法:用于遍历数组中的元素 for (var_name in array) {for-body} 7.5 swtich 语法:switch (expression) {case VALUE or /REGEXP/: statement; ...; default: statementN} 7.6 break and continue break [n]:退出当前循环,n是一个数字,用于指定退出几层循环; continue:提前结束本轮循环而进入下一轮; 7.7 next 提前结束对本行文本的处理,而提前进入下一行的处理操作;~]# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd 8、数组 关联数组:array[index-expression]index-expression: 可以使用任意字符; 如果某数组元素事先不存在,则在引用时,awk会自动创建此元素并将其值初始化为空串; 因此,若要判断 数组中的某元素是否存在,要使用“index in array”的方式进行判断;要遍历数组中的元素,则要使用for (var_name in array)的方式进行;此时,var_name会遍历array的每个索引,所以,要显示数组元素的值,要使用array[var_name]weekdays weekdays[mon]="Monday" weekdays[tue]="Tuesday" ...for (i in weekdays):此时,i变量会遍历weekdays数组的每个索引,即mon, tue,而非元素的值“Monday”或"Tuesday"等; 要获取元素的值:weekdays[i]例如: 统计指定文件中所有行中每个单词出现的次数; 可定义一个数组,用单词本身当索引,而元素的值存储单词出现的次数How are you? How old are you?count[How]=2 count[are]=2 count[you?]=2 count[old]=1 整个文件统一统计: ~]# awk '{for(i=1;i<=NF;i++) {count[$i]++}}END{for(j in count) {print j,count[j]}}' /root/count.txt 每行单独统计: ~]# awk '{for(i=1;i<=NF;i++) {count[$i]++};for(j in count) {print j,count[j]};delete count}' /root/count.txt 统计当前系统上所有tcp连接的各种状态的个数PV;~]# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state) print i,state[i]}'统计指定的web访问日志中各ip的资源访问次数: ~]# awk '{ip[$1]++}END{for(i in ip) print i,ip[i]}' /var/log/httpd/access_log 9、函数 内建函数和用户自定义函数9.1 内建函数数值处理: rand():返回0至1之间的一个随机数;字符串处理: length([s]):返回指定的字符串的长度;sub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其第一次被匹配到的内容替换为s所表示的字符串; gsub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其所有被匹配到的内容均替换为s所表示的字符串;split(s,a[,r]):以r为分隔符去切割字符串s,并将切割后的结果保存至a表示的数组中;注意:awk的数组下标从1开始编号~]# awk '{split($0,userinfo,":");print userinfo[1]}' /etc/passwdsubstr(s,i[,n]):从s所表示的字符串中取子串,取法:从i表示的位置开始,取n个字符;时间类函数: systime():取当前系统时间,结果形式为时间戳;9.2 用户自定义函数function f_name(p,q) { ... }