文本数据处理之awk

1、awk简介
linux

     awk是一种优良的文本处理工具。它不只是 linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。 awk提供了极其强大的功能:能够进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。最简单地说, awk 是一种用于处理文本的编程语言工具。正则表达式

     awk与grep,sed是处理文本数据必不可缺且必须熟练的处理工具。shell

     grep : 文本过滤器express

      sed:流编辑器编程

     awk : 报告生成器数组

2、awk的输出bash

     awk其输出格式有两种:print和printftcp

     print是简单的显示命令,printf 是格式化显示命令编程语言

一、print的使用格式编辑器

   print item1, item2, ...

  ① 各项目之间使用逗号隔开,而输出时则以空白字符分隔;

  ② 输出的item能够为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,然后再输出;

  ③ print命令后面的item能够省略,此时其功能至关于print $0, 所以,若是想输出空白行,则须要使用print "";

   

二、printf的使用格式

      printf format, item1, item2, ...

 ① 其与print命令的最大不一样是,printf须要指定format;

 ② format用于指定后面的每一个item的输出格式;

      每个格式对应一个字段

 ③ printf不会自动打印换行符;\n

 

三、format

  format格式的指示符都以%开头,后跟一个字符;

  ① %c: 显示字符的ASCII码;

  ② %d, %i:十进制整数;

  ③ %e, %E:科学计数法显示数值;

  ④ %f: 显示浮点数;

  ⑤ %g, %G: 以科学计数法的格式或浮点数的格式显示数值;

  ⑥ %s: 显示字符串;

  ⑦ %u: 无符号整数;

  ⑧ %%: 显示%自身;

四、修饰符

  ① N: 显示宽度;

  ② -: 左对齐;

 

  ③ +:显示数值符号,默认为右对齐;

3、awk的变量

一、awk内置变量之记录变量:

      FS : field separator,读取文件本时,所使用字段分隔符;

      RS : Record separator,输入文本信息所使用的换行符;

    OFS : Output Filed Separator,文件分隔符;

    ORS:Output Row Separator,行分隔符;

   

二、awk内置变量之数据变量

     NR: The number of input records,awk命令所处理的记录数;若是有多个文件,这个数目会把处理的多个文件中行统一计数;

     NF:Number of Field,当前记录的field个数;

   

     FNR: 与NR不一样的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

     ARGV: 数组,保存命令行自己这个字符串,如awk '{print $0}' a.txt b.txt这个命令中,           ARGV[0]保存awk,ARGV[1]保存a.txt;

 

     ARGC: awk命令的参数的个数;

     FILENAME: awk命令所处理的文件的名称;

     ENVIRON:当前shell环境变量及其值的关联数组;

三、用户自定义变量

     gawk容许用户自定义本身的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

   ① 脚本中赋值变量

     在gawk中给变量赋值使用赋值语句进行

   ② 命令行中使用赋值变量

     gawk命令也能够在“脚本”外为变量赋值,并在脚本中进行引用。


4、输出重定向

 一、 print items > output-file

       print items >> output-file

       print items | command

 二、特殊文件描述符:

      /dev/stdin:标准输入

      /dev/sdtout: 标准输出

      /dev/stderr: 错误输出

      /dev/fd/N: 某特定文件描述符


5、awk的操做符

 一、算术操做符:

      -x: 负值

     +x: 转换为数值;

   x^y: 次方

   x**y: 次方

    x*y: 乘法

   x/y:除法

   x+y: 加法

    x-y: 减法

   x%y: 取余

 二、字符串操做符:

   只有一个,并且不用写出来,用于实现字符串链接;

 三、赋值操做符:

    =、 +=、-=、*=、/=、%=、^=、**=、++、--

注:若是某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;

 四、布尔值

     awk中,任何非0值或非空字符串都为真,反之就为假, 与bash彻底相反。

 五、比较操做符

   x < y  小于

   x <= y  小于或等于

   x > y  大于

   x >= y  大于或等于

 

   x == y  等于

   x != y  不等于

   x ~ y   被匹配的字符

   x !~ y  不被匹配的字符

 

 六、表达式间的逻辑关系符

   &&    与

    |  |     或

 

 七、条件表达式

   selector?if-true-exp:if-false-exp


if selector; then
 if-true-exp
else
 if-false-exp
fi


 八、函数调用

   function_name (para1,para2)

    多个参数用逗号隔开

6、awk的输出模式

 一、 awk 'program' input-file1 input-file2 ...

  其中的program为:

   pattern { action }

   pattern { action }

   ......

   

 二、常见的模式类型

    Regexp: 正则表达式,格式为/regular expression/

    expresssion: 关系表达式,其值非0或为非空字符时知足条件,能够是字符串或数字的比较

    Ranges: 指定的匹配范围,格式为pat1,pat2

    BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

    BEGIN模式是 在真正处理以前作些准备工做的功能,END模式是 在运行以后输出相关信息。

 

    Empty(空模式):匹配任意输入行;

 三、常见的语句动做

    Expressions :  表达式

    Control statements: 控制语句

    Compound statements : 组合语句

    Input statements :  输入语句

    Output statements : 输出语句

7、控制语句

  一、if-else

  语法:if (condition) {then-body} else {[ else-body ]}

# awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd

 

  二、while

    此while语句在awk中的做用体现是要么作成的循环体,要么在某个片上的循环

  语法: while (condition){statement1; statment2; ...}

 

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

 

  三、do-while

    与while语句不一样之处在:无论条件真假先执行一次循环体,再执行控制语句

  语法: do {statement1, statement2, ...} while (condition)

 

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

 

  四、for

  语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

 

# awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd

 

    for循环还能够用来遍历数组元素

  语法: for (i in array) {statement1, statement2, ...}

 

# awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd


  五、case

  语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}


  六、break 和 continue

    经常使用于循环或case语句中

  七、 next  

  提早结束对本行文本的处理,并接着处理下一行

 

# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd


8、awk中使用的数组

  一、数组

     array[index-expression]

     index-expression可使用任意字符串;须要注意的是,若是某数据组元素事先不存在,那么在引用其时,awk会自动建立此元素并初始化为空串;所以,要判断某数据组中是否存在某元素,须要使用index in array的方式。

# netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

  二、要遍历数组中的每个元素,须要使用以下的特殊结构

    for (var in array) { statement1, ... }

    其中var用于引用数组下标,而不是元素值

  三、删除数组变量

   从关系数组中删除数组索引须要使用delete命令。使用格式为

    delete  array[index]

9、awk的内置函数

  一、split(string, array [, fieldsep [, seps ] ])

   功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从0开始的序列;

  二、length([string])

   功能:返回string字符串中字符的个数;

  三、substr(string, start [, length])

   功能:取string字符串中的子串,从start开始,取length个;start从1开始计数

  四、system(command)

   功能:执行系统command并将结果返回至awk命令

  五、systime()

   功能:取系统当前时间

  六、tolower(s)

   功能:将s中的全部字母转为小写

  七、toupper(s)

   功能:将s中的全部字母转为大写

相关文章
相关标签/搜索