awk基本用法和工作原理详解(4)

示例:

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i); i++}}' /etc/grub2.cfg awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}' /etc/grub2.cfg awk 'BEGIN{ total=0;i=0;do{total+=i;i++}while(i<=100);print total}‘ 3.awk的for

语法:

for(expr1;expr2;expr3) {statement;…}:expr1为变量赋值,如var=value,初始进行变量赋值;expr2为条件判断语句,j<=10,满足条件就继续执行statement;expr3为迭代语句,如j++,每次执行完statement后就迭代增加
for(var in array) {for-body}:变量var遍历数组,每个数组中的var都会执行一次for-body

示例:

awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg awk '/^[^#]/{type[$3]++}END{for(i in type)print i,type[i]}' /etc/fstab awk -v RS="[[:space:]/=,-]" '/[[:alpha:]]/{ha[$0]++}END{for(i in ha)print i,ha[i]}' /etc/fstab 4.awk的switch

switch 语句,相当于bash中的case语句。
语法:

switch(expr) {case VAL1 or /REGEXP/:statement1; case VAL2 or /REGEXP2/: statement2;...; default: statementn}:若expr满足 VAL1 or /REGEXP/就执行statement1,若expr满足VAL2 or /REGEXP2/就执行statement2,以此类推,执行statementN,都不满足就执行statement

5.awk的break、continue和next

break 和continue,用于条件判断循环语句,next是用于awk自身循环的语句。

break[n]:当第n次循环到来后,结束整个循环,n=0就是指本次循环
continue[n]:满足条件后,直接进行第n次循环,本次循环不在进行,n=0也就是提前结束本次循环而直接进入下一轮
next:提前结束对本行的处理动作而直接进入下一行处理

示例:

awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}‘ awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}‘ awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd 6.awk的数组

awk的数组是关联数组,格式为:

array[index-expression]:arry为数组名,index-expression为下标。

实际上index-expression可使用任意字符串,字符串要使用双引号括起来;如果某数组元素事先不存在,在引用时,awk 会自动创建此元素,并将其值初始化为“空串”。
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历。
若要遍历数组中的每个元素,要使用for循环:for(var in array) {for-body},使用for循环会使var 会遍历array的每个索引。此时要显示数组元素的值,则要使用array[var]。
示例:

awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}‘ awk '!arr[$0]++' dupfile awk '{!arr[$0]++;print $0, arr[$0]}' dupfile awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}‘ netstat -tan | awk '/^tcp/{state[$NF]++}END{for(i in state) { print i,state[i]}}' awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}'/var/log/httpd/access_log 7.awk的函数

awk的函数有许多,除了系统自带的内建函数还有就是用户自定义的函数,这里挑选几个常���的函数。

rand():返回0 和1 之间一个随机数
srand():生成随机数种子
int():取整数
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串进行搜索,r表示的模式匹配的内容,并将第一个匹配的内容替换为s
gsub(r,s,[t]):对t字符串进行搜索,r表示的模式匹配的内容,并全部替换为s所表示的内容
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…也就是说awk的数组下标是从1开始编号的。
substr(s,i,[n]):从s所表示的字符串中取子串,取法:从i表示的位置开始,取n个字符。
systime():取当前系统时间,结果形式为时间戳。
system():调用shell中的命令。空格是awk中的字符串连接符,如果system 中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用"" 引用 起来。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13429.html