文本处理三剑客——grep,awk,sed;grep是基于pattern过滤输出,有三种模式,grep,egrep以及fgrep;sed则是一种流编辑器,进行插入删除,常用于进行文本中的替换操作;而awk的功能就更加强大了,作为一种格式化文本工具,awk通过分隔符控制文本,awk默认的分隔符是空格;awk还可以通过pattern匹配按行进行遍历,通过算术表达式对行进行排查,还可以for,while,continue,break等控制语句找到符合条件的信息进行输出;他还可以对输出的结果进行修饰采用printf的输出方式,控制格式;

  awk其实就是gawk,他是通过从gawk链接过来的一个命令,使用man awk时出现的也是gawk的内容;这是因为以前的人一直使用awk成为了习惯,所以特地配置了这个命令的链接;

  awk基本格式

     awk [options] 'program' file ...

     program:pattern{action statements;...}

       pattern:pattern在awk中有很多种类,其中典型的是在执行awk命令时首先需要执行的        pattern还可以执行正常环境下的pattern语法,不过需要用“//”包含;

       action:print,printf两种,print作为正常的输出,输出匹配的字段,awk命令是一种基      于分隔符的形式来操作的命令,会将当前字段分隔为$1,$2,$3...$NF;由print来输出;printf      则可以在输出字段的同时,对字段进行格式规整的操作;

  awk执行流程:

   ①首先执行BEGIN{}语句段,一段用于在数据前方起到一个开头的作用;

   ②读取指定文件中的每一行数据,按行遍历,根据我们提供的pattern值进行匹配,若想输出匹配   到的pattern数据,则print本身,不需要加字段$1,$2这些,如awk '$3>500{print}' /filepath;这   样就只输出$3这个字段中大于500的行数据了;

   ③执行END{}语句段;

  

  awk:

   常用选项:

    -F:指定字段分割符;

    -v:手动设置变量;var=value;

   1.awk中的变量:

    awk中的变量有两种,一种是自建变量,即用-v选项指定变量名,或者在语句块中直接声明使用;

   另一种则是awk这个命令中的内建变量了;

    内建变量:

    FS:相当于-F选项的设置输入分隔符;

    如:使用FS指定“:”作为字段分隔符;

     wKiom1mRDUXS5re-AAAQv126gsg129.jpg-wh_50

    OFS:设置输出分隔符,在输出的数据进行分隔,默认是空白字符;

    如:

     wKiom1mRDm6D82pdAAATwgaEWzw766.jpg-wh_50

    NF:字段数量,$NF作为输出的最后一个字段,而NF则输出这个字段的序列号;

    如:$NF

     wKiom1mRDvTwOOA1AAAaGOptfGQ527.jpg-wh_50

       NF

     wKiom1mRDzfRfQ5vAAASLnUSaqM786.jpg-wh_50

    NR:awk遍历行时输出每行的行号;在END{}语句块使用时则输出awk遍历的这个文件的总行数;可    以将两个文件合起来一起统计行数,只要在文件路径处再加一个路径即可;这样统计出来的就是总    的行数;

    如:

     wKiom1mRD7CQXf31AAATMQLfOWY770.jpg-wh_50

    FNR:file number of record,分别统计各个文件的行数,行号;这样统计出来的就是两个文件    分别的行数

   FILENAME:输出当前处理的文件名;

   如:

     wKiom1mREH6huhz2AAAZWky4w7c043.jpg-wh_50

   ARGC:输出命令行中参数的个数;

   如:

    wKiom1mREOzTqBYpAAASXoih89Q584.jpg-wh_50

    该段命令中的参数是awk,以及后面的文件路径

   ARGV:以数组的形式保存命令行中参数的内容;

   如:

   wKioL1mREWqx67laAAAyhCsUBYw388.jpg-wh_50 

  2.printf:格式化输出结果

  printf这个action,除了具备print的功能之外,他还可以为每个输出的量固定格式,固定其字符串长度,左右对齐,显示整数或浮点数等;

  printf "format",item,item

  format必须符合要求,且每一个item都需要对应一个模式,即一种format,format需要用双引号括起来;

  format的格式与类型:

  以%开头,后跟这个item类型

  格式符:

      %c:显示字符的ASCII码;

      %d,%i:显示十进制整数;

      %f:显示浮点数字;

      %e,%E:使用科学计数法显示数字;

      %g,%G:使用科学计数法显示浮点数字;

      %s:显示字符串;

      %u:显示无符号整数;

      %%:显示%自己;

  常用的是%s,%d等;当需要指定字符串长度时,直接在%后加字符串长度,如%10s,表示10个字节字符串;

  -:表示向左对齐,默认是向右对齐;

  +:显示数字的正负符号;

  如%-10s,%+10s

  示例:

  wKioL1mRoBnCp_aGAAAc4QUjqUA468.jpg-wh_50


  3.操作符

  ①算术操作符

  如 +,-,*,^,/,%

  -x:将正数转化为负数;

  +x:将字符串转化为数值;

  如:x%y

  wKioL1mRn87jwEw_AABLM_HaFMo003.jpg-wh_50

  ②赋值操作符:

  =,+=,-=,*=,/=,%=,^=

  ++,--

  用法同上

  ③比较操作符:

  >,>=,<,<=,==,!=

  如:找到UID大于500的用户信息

  wKioL1mRoH7xo-2sAABZOgffrtQ913.jpg-wh_50

  ④模式匹配操作符:

  ~:左边的字符串是否与右边的pattern匹配;

  !~:左边的字符串是否与右边的pattern不匹配;

  如:从$NF找到匹配nologin的行

  wKiom1mRoNOjeyLMAABQcORP-co519.jpg-wh_50

  ⑤逻辑操作符:

  与(&&),或(||),非(!)

  可以将匹配信息相与或操作,提炼出想要的结果;

  如:找到UID大于500小于1000的用户信息   

  wKiom1mRoeOAOMq0AABz3s6S7bU319.jpg-wh_50

  ⑥条件表达式:

  condition(selector)?if-true-expression:if-false-expression

  如:当满足UID大于500小于1000时,将变量user值设为yes,否则设为no

  wKiom1mRozfTtBxtAAAiBkNLriY688.jpg-wh_50

  

  4.pattern

  ①空pattern:所有的行统一遍历,不存在匹配值;

  ②设置pattern,需要用“//”隔开;

  如:

  wKioL1mRo92SPHLkAAAQeu6C1Oo933.jpg-wh_50

  ③设置pattern范围:/pattern1/,/pattern2/

  如:找到开头为w,到开头以n的用户信息

  wKioL1mRqCnRH2juAAAnrd8ZpnA404.jpg-wh_50

  ④BEGIN{}

  BEGIN{}语句块只有在awk命令执行之前才会实现;通常用于输出结果的开头;

  如:设置开头的user UID标题

  wKiom1mRqX6w3BJsAAAr_AhaM1c477.jpg-wh_50

  ⑤END{}

  END{}语句块只有在awk命令执行结束后才会实现,通常作为这一次命令的总结;

  如:END语句块在尾部生成隔开符号*,并且计算总行数;

  wKioL1mRqjSB3-cnAAAuyb1CX3Y399.jpg-wh_50 


  5.控制语句

  如for,while,next,do-while,if-else等;

  for循环:

  语法:for (expr1;expr2;expr3) statement

    expr1:给变量设置初值,如i=1;

    expr2:给变量she'zhi范围,如i<100;

    expr3:执行递增递减操作,如i++,i--;

  如:使用for循环遍历一行,读取一行中每一组分隔字段的长度,使用length内置函数;

  wKiom1mRsbjSq5XTAAAk4debWek892.jpg-wh_50

  while循环:为真则进入循环,为假则退出循环;

   语法:while (condition) statement

  如:

  wKioL1mRsoGTsrYtAAAvZrspa4Y507.jpg-wh_50

  do-while循环:原理同while一样,不同在于,其是执行一遍再判断是否满足要求,若不满足再退出;

  语法:do statement while (condition)

  如:

  wKioL1mRs3SQ0e3WAAAnVTXo1yo354.jpg-wh_50

  next:当满足条件时则提前退出本次循环,进入下一次循环;

  如:

  wKiom1mRvpSSZF98AAAzVbzpExA739.jpg-wh_50

  break:当满足条件时则退出循环;

  如:

  wKiom1mRvs_BKh-wAAAxzLDDIxE545.jpg-wh_50

  continue:当满足条件时,则直接跳过本次循环,进行下一次循环;

  同上;


  6.数组:

  awk中的数组有两个特性

  ①当数组本身不存在,却引用这个数组时,会将数组的值设为空字符串,相当于0;

  ②数组可以用字符串来表示,但字符串需要加双引号,如a["letter"];

  引用数组

  如:

  wKioL1mRvDWjppC2AAAdyfgm79M824.jpg-wh_50

  查看一个设定好的文件中的单词的个数,使用for循环的s in array的形式:

  如:

  wKiom1mRvQuio8LgAAA-KzGrc1g347.jpg-wh_50