首页 > 代码库 > 格式处理器--AWK

格式处理器--AWK

简介:

grep、sed、awk为三个主流的文本处理器,但是在处理上各有优缺点。这里我们只介绍awk

          AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

一、基本语法

  awk [options] ‘program’ file  file ..

  awk [options]   ‘PATTERN{action}’ file   file…

输出格式:print item1,item2。。。

(1)各项之间用逗号分割,实现出来有空格;若用空格显示出来则无空格

image

(2)输出的各项可以字符串,当前记录字段,变量或awk的表达式;数值会被隐式转换为字符串后输出

(3)如果后面的print后面的item省略,相当于print $0:输出全部

image

===============================================================

二、awk的变量

       主要分为内置变量和自定义变量

(1)内置变量

FS:Filed Seperator 输入时的字段分割fu
RS: 输入行分割符
OFS 输出时的字段分割符
ORS 输出时的行分割符
NF 字段数
NR 行数,所有文件一并计数
FNR 行数,各文件分别计数
ARGV 数组保存命令本身的字符
ARGC 保存awk命令参数的个数
FILENAME awk正在处理的当前文件的名称

下面举例显示一下区别:

(a)使用不同的分割

image

(b)对文件行数计数

image

(c)对各文件分别计数

image

(d)使用数组保存命令本事的字符

image

(e)保存命令参数的个数

image

(f)显示awk当前正在处理的文件系统的名称

image

===============================================================

(2)自定义变量

     -v   var_name=VALUE        //变量名区分字符大小写

    a.可以在program中定义

    b.可以在命令行通过-v选项自定义

image

三、awk的printf用法

使用格式:printf  format, item1, item2….

要指定format

不会自动换行,换行需要使用\n

format用于为后面的每个item指定其输出格式

(1)format的格式的指示符以%开头,后面跟一个字符

%c 显示字符的ASCII码
%d,%i 十进制整数
%e 科学计数法显示数值
%f 显示浮点数
%g 以科学计数法格式或浮点数格式显示数值
%s 显示字符串
%u 显示无符号整数
%% 显示%自身

将字符转换为ASCII码

image

打印为十进制

image

讲某数转换为科学计数格式

image

打印字符串

image

image

以浮点数的方式计数

image

其他就不一一演示了

=====================================================

(2)awk的输出重定向

  >,  >>,  | 

特殊文件描述符:

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

image

========================================================

(3)awk的操作符

算术操作符:+ ,-,*,**,%,正负值:+x,-x

字符串操作符:连接

赋值操作符:=,+=,-=,*=,/=,%=,^=,**=,++,--

        如果模式自身是等号,要写为/=/

比较操作符:<  <=  >   >=   ==   !*   ~   !~

逻辑操作符:&&   || 

 

(4)条件表达式

selector?if-ture-ezpression:if-false-expression

条件?为真输出的内容:为假输出的内容 

image

 

四、函数调用

function_name (argu1,argy2)

(1) Regexp:格式/PATTERN/        //仅处理被/PATTERN/匹配到的行

image

(2)Expression:表达式,其结果为非0或非空字符串时满足条件:

        仅处理满足条件的行

image

(3)Ranges:行范围,此前地址定界,startline,endline

        仅处理范围内的行

(4)BEGIN/END:特殊模式,仅在awk命令的program运行之前或运行之后执行一次

(5)Empty:空模式,匹配文件中的所有行

 

五、控制语句

(1)   格式:if (condition) {then body}  [{else {else body}]

image

(2)  格式:while (condition) {while body}

#[root@bogon ~]# awk ‘{i=1;while (i>=NF) {if ($i>=20000) print $i;i++}}‘ test.txt

 

(3)  格式:do {do-while  body} while (condition)

image

(4)  格式:for (variable assignment ; condition; iteration process) {for body}

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

  ***for循环可以用来遍历数组元素;语法:for  (i in  array) {for  body}

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

 

(5)switch  (expression) {case  VALUE  or  /RGEEXP/:  statement1;...default: statementN}

(6)  break     continue  循环控制

(7)next,提前结束本行的处理注解进入下一行的处理

image

六、 awk对于数组的应用  

   关联数组 

       array[index-expression]

       index-expression:可以使用任意字符串;如果某数组元素在引用时事先不存在,那么在引用时awk会自动创建此元素并初始化为空串,因此要判断数组是否存在该元素,必须使用index in array  这中格式

        A[first]="hello awk"

        print A[second]

        要遍历数组中的每个元素,需要使用如下特殊结构

          for (var in array) (for body)

        其中var会遍历数组的索引

          state [LISTEN]++

          state [LISTEN]++

      image

         删除数组元素:需要从关系数组中删除数组的索引

        delete  array[index]

 

七、awk的内置函数

      1、 split(string,array[,fieldsep[,seps]]);

        功能:将string表示的字符串以fielfsep为分割符进行切片,并将结果保存在数组中,数组以1开

       2、ength([string])

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

substr(string, start [, length])

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

tolower(s)

3、能:将s中的所有字母转为小写

toupper(s)

功能:将s中的所有字母转为大写

格式处理器--AWK