http://www.zsythink.net/archives/tag/awk/ 参考 自总结中
awk:逐行处理,默认以"换行符"为标记,识别每一行 awk基本语法: awk[option]'Pattern{Action}'file 选项 模式 动作 选项:awk -v FS='#' 模式:1 空模式 (空模式会匹配文本中的每一行) 2 关系运算模式 (用到关系运算符:x<y;x!=y;x~/正则/) 3 BEGIN/END模式 (BEGIN模式,表示开始处理文本之前执行的操作,END之后) 4 正则模式 ( awk '/正则/{print $0}' /etc/passwd ) 5 行规范模式 ( awk '/正则/,/正则/{动作}' /etc/passwd )( awk 'NR>1 && NR<5 {print $0}' /etc/passwd ) 动作:awk '{ print $0 }' test1.sh awk '{ print $1 }{ print $2 }' test1.sh 等同于 awk '{ print $1;print$2}' test1.sh 循环语句: 1/if awk '{ if (条件){动作} }' file (如果'if'对应的大括号只有一条命令可以省略动作的大括号) awk -F ":" '{ if(条件){动作} else{动作} }' file awk '{ if(条件){动作} else if(条件){动作} else{动作}}' file 2/for awk '{ for(初始化;布尔;更新){动作}}' file awk '{ for(变量 in 数组){动作}}' file 3/while awk '{ while(条件){动作}}' file awk 'do{动作}while(条件)' file(do...while和while的区别是do...while无论是否满足条件都会先执行一遍) 跳出循环: continue的作用:跳出当前循环 next的作用:让awk直接从下一行开始运行;类似continue区别是continue针对'本次循环',而next针对'逐行处理' break的作用:跳出整个循环 exit表示退出当前脚本;当有END模式时,会直接执行END动作再退出 分隔符形式 1:awk -F# 2:awk -v FS='#'(-v 自定义函数) 数组: 1 awk数组的第1个下标是1,可以自己设置下标从0开始 2 数组元素可以为"空",即"空字符串"是存在的,todd[3]="";if(4 in todd){print "exist"} if(下标 in 数组名),判断数组中是否存在对应元素 {count[$1]++}{for(i in count)} count是数组名,由于引用的数组不存在,所以会创建下标为改内容的元素, 且元素值在自加后为1,当再次遇到该元素时,由于下标一样的元素存在且值为1,故会在1的基础上自加,这样就可以起到计数的功能。 内置函数:算数函数、字符串函数、时间函数、其他函数等 算数函数:rand(随机生成值不变0-1),srand(随机生成值变化0-1),int( int(100*rand())生成1-100随机整数 ) 字符串函数:gsub(指定范围内的全局替换),sub(指定范围内的单次替换,只替换第一次匹配到的字符) length(可以使用index函数指定字符位于整个字符串的位置), split函数( split(ts,huan,":"); 动态创建数组) asort函数(根据元素的值进行排序,但是经过asort函数排序过后的数组的下标会被重置) asorti函数(根据下标进行排序,生成新数组) 例: [root@centos68 awk]# awk 'BEGIN{ t["z"]=66;t["q"]=88;t["a"]=3; > len=asorti(t,newt); > for(i=1;i<=len;i++){print i,newt[i],t[newt[i]]} }' 1 a 3 2 q 88 3 z 66 三元运算符:可代替"if...else语句" 即 条件 ? 结果1 : 结果2 1、在awk中,如果省略了模式对应的动作,当前行满足模式时,默认动作为打印整行,即{print $0} 2、在awk中,0或者空字符串表示"假",非0值或者非空字符串表示"真" 据此可以打印出奇偶行 奇:awk 'i=!i' file 偶: awk '!(i=!i)' file