awk是比sed更强大的文本处理工具,sed通常是以一整行为处理单位,而awk则可以按照指定的分隔符将一整行分为多个字段单独进行处理。

    awk的语法

    

awk -F separator 'BEGIN{command}condition1{command1}condition2{command2}...END{command}' filename #除了处理filename之外 awk也以处理标准输入

     -F 指定分隔符,默认是空格符 例如如果指定:为分隔符,则可以这样-F:

     BEGIN用于指定在处理第一行之前应该执行的指令,如果command由多条,则可以用分号分开

     END 用于指定处理完所有文本行之后应该执行的指令

     中间的condition{command} 用来指定在处理文本行的时候应该执行的指令,condition用来指定条件通常是表达式,command用来指定满足condition的时候应该执行的操作。

  awk的几个常用的内建变量

  $0 当前处理的一整行内容

  $1 当前处理的行使用separator分隔后的第一个字段

  $2 。。。。。的第二个字段

  $#。。。。。以此类推

  NR 当前正在处理的行号

  NF 当前处理的行有多少个字段

  FS 当前指定的空格符,默认是空格键 其实完全可以用-F选项来替代

   

  awk使用print 或者printf来向屏幕打印符合条件的内容,两者还是有一定区别的

  使用print打印的话,字段之前使用,分隔,而打印的时候字段内容之间是用以空格分开

  一个例子

  awk -F: '{print $1,$3}' /etc/passwd

   Linux基础(20)文本处理三剑客之awk_awk

   如果非要指定格式的话可以使用"" 里面加入转移字符 比如说"\t"

  awk -F: '{print $1"\t"$2}' /etc/passwd

   相比之下printf就更常用一些,printf可以方便以指定的格式打印内容

   printf的基本格式  printf "pattern" content

   在awk中使用printf的时候需要注意一下几点

   1.pattern与content之间使用,分开

   2.使用printf打印变量内容的时候,不要使用$var_name(除了$0,$1等内建变量)

   3.被打印的变量之间也要使用,分开 

   4.需要在pattern中手动指定换行符\n

  awk -F: '{printf "%10s\t%10s\n"},$1,$3' /etc/passwd

   Linux基础(20)文本处理三剑客之awk_awk_02

   

  awk的功能远远不止与此,下面介绍一些常用的awk的其他功能

  1.使用算数运算符

  在awk的command中可以进行常见的算数运算

  常见的算数运算符由+ - * / %  +=  -=  %=  /=  ++  -- 

  2.使用比较操作符

  > < >= <=  ==  != ~

  值得一提的是 ~ 用来判断某个字段是否符合正则表达式的模式,正则表达式的模式需要用//括起来

  例子 

 awk -F: '$NF~/nologin$/{print $1,$NF}' /etc/passwd

  3.使用控制语句

  if else语句

 awk -F: '{if($3<499){print $1,"System User"}else{print $1,"Common User"}}' /etc/passwd

  需要注意的两点,与condition{command}不同,if条件语句是写在{}里面的,如果是执行语句由多条的话,必须使用{}括起来,如果执行语句只有一条的话,则可以省略{}

  4.使用循环语句

  while 

 awk -F: '{i=1;while(i<=3){printf "%-10s" ,$i;i++}}' /etc/passwd #对于每行只打印前三个字段

  for 

 awk -F: '{for(i=1;i<=3;i++){print $i}}' /etc/passwd

  使用for还可以用来遍历数组

  语法结构为 for(var in array){command} #注意var是下标,不是数组的内容

 awk -F: '{SHELL[$NF]++}END{for (S in SHELL){print S,SHELL[S]}}' /etc/passwd #统计每种shell用户的数量

  5.continue,break,case,next不怎么常用,这里不在一一介绍

  当然awk的功能远不止这些,这里仅仅是列处理最常用的一些功能,想了解更多自行man。