文本三剑客grepsedawkgrep主要应用于文本内容查找,sed可以对文本进行原处更改也可查找文本,awk是报告生成器。grep之前已经写过博客,这里不写了。

awk

  awk不仅仅是一个命令而是一种编程语言,它具有一个编程语言基本上的编写格式,这个格式与bash的格式不相同,并且在不能在awk命令中不能直接使用``调用bash的命令,这个很让人凌乱。awk也是一行行的处理文本,只是可以把文本分为多个字段,进行细致的处理。

  awk既然作为一门语言,那么我们就可以把awk分成一个个模块来说:awk命令格式,匹配,输出,变量,数组,变量操作,控制语句,调用系统命令,函数。

1 awk命令格式

  awk[option] ‘progrem’file [file]

  option的选项经常使用的不是很多   

       -F指定输入分隔符,$1代表第一个字段,$2代表第二个字段以此类推,$0代表打印整行
    -f 指定脚本,可以把progrem中很多的命令写入到文件中使用-f直接调用
     -v给变量赋值
       ‘progrem’可以分为四段
       第一段是匹配,被模式匹配到的行才会被处理
       第二段是BEGIN段,在操作文件前执行的命令,一般用作给文本打表头,格式如:awk ‘BEGIN{print0}’
       第三段是对文本操作段,倘若不写是打印整行,命令格式:awk ‘{print $0}’
       第四段是END段,是文件操作后执行的命令,命令格式:awk ‘END{print 0}’ file

2 匹配和输出

  既然是文本操作,那么必须具有匹配字符的能力,awk的匹配能力远大于sed,之所以这么说是因为,awk不仅可以进行行匹配还可以进行字段匹配,字段匹配可以大大降低匹配难度并且可以提高匹配精度。awk的匹配使用的拓展正则表达式。格式如下:

  /peter/这是行匹配

  $5~ /peter/ 这是字段匹配

  awk有两个输出的命令,一个是print,一个是printfprintf可以一特殊的格式输出,也是其强大的制表功能的基本。

       awk‘BEGIN{a=1;b=2;c=3print a,b,c}’
       awk'BEGIN{a=1;b=2.2;c=3.3;printf "%d %10.3f %-10.3f\n",a,b,c}'
       printf和大多数的编程语言的输出语法类似
       %d输出整数
       %f输出浮点数(小数)
       %s输出字符串
       %c输出字符
       %%输出%自身
       -10.3的含义是输出的内容总共占10个字符,保留三位小数,-代表左对齐,不带-代表右对齐。

3 变量和数组

  变量分为系统的变量和自定义变量首先说自定义变量和数组,自定义变量可以通过-v定义也可以在progrem中定义。通过-v定义的格式

  awk-v tom=200 ‘BEGIN{print tom}’

progrem中定义变量的格式

  awk‘BEGIN{tom=200;print tom}’

  awk中自定义变量可以不定义直接使用,数组也是如此a[tom]=200。变量没被赋值就引用的话,变量的值为空,做算术运算时,未赋值变量的值为0

  awk常用的系统变量有以下几个

       FS指定输入分割符和- F的功能相同
       OFS输出分隔符
       NF字段数,被分隔符分割的字段数
       NR行号
       FNRawk可以接受多个文件输入,这里记录行号是每个文件分开记录,NR是不分开记录
       RS指定输入换行符,不使用原本的回车符,使用指定的字符为换行符
       ORS指定输出分割符


4 变量操作

  awk变量操作就极其简单了,直接使用操作符就可以了。格式如下

  awkBEGIN{print 1+2}’

  常用算术操作符有如下几个

       +,-,*,/,%,^,++分别对应加减乘除取余次方自加
       常用比较操作符
       >,>=,<,<=,==,!=
       模式匹配
       ~,!~
       =~ 左边能否被右边的peter匹配到,注意peter格式,在if语句中也要如此使用和bash的[ ]不同不要记混了:/peter/

5 控制语句

  判断语句格式:

       awk‘BEGIN{if(1 < 2)print 1}’
       awk‘BEGIN{if(1 ~ /[[:digit:]]/){c=1+2;print c}}’
       循环语句格式:
       awk‘BEGIN{for(i=1;i < 3;i++)print 1}’
       awk‘BEGIN{while(i<3){print i;i++}}’
       awk‘BEGIN{do{print i;i++} while(i<3)}’
       这里也支持break终止循环
       continue跳出本次循环

6 调用bash命令

       awk‘BEGIN{system(“hostname”)}’

总结

  awk还有很多奇怪的用法,这里只总结一点基本用法,主要熟练awk的输出和匹配,对文本的操作就解决了,简单使用数组、运算符和控制语句就可以对数据进行处理了。