awk

 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
原文地址:https://www.cnblogs.com/shiina-ringo/p/9857776.html