AWK完整笔记

来源:互联网 发布:淘宝怎么才能排名靠前 编辑:程序博客网 时间:2024/05/01 20:50

    Awk是一种文本处理工具,不仅是Linux中也是任何环境中现有功能最强大的数据处理引擎之一;

         AWK提供的功能:样式装入,流控制,数学运算符,进程控制语句甚至内置的变量和函数;具备完整语言的几乎所有精美特性.

         AWK拥有自己的语言:AWK程序设计语言,定义为:样式扫描和处理语言;

         允许创建简短的程序,这些程序读取输入文件,为数据排序/处理数据/对输入执行计算/生成报表

         基础是:只要输入数据中有模式匹配,就执行一系列指令.

        所以命令的语法始终是:awk ‘{pattern + action}’

         gawkAWKGUN版本;

         如果UNix作业系统中中本身没有AWK功能,可通过anonymous ftp到下列地方取得:

phi.sinica.edu.tw:/pub/gnu

ftp.edu.tw:/UNIX/gnu

         prep.ai.mit.edu:/pub/gnu

        

         总结:模式匹配语法特别有用,通常用于数据检索和数据转换

 

AWK的调用方式:

         awk命令行,可以像unix命令一样使用awk

         使用-f选项调用awk程序。awk允许将一段awk程序写入到一个文本文件中,然后用awk –f 调用和执行这段程序.

         命令解释器调用awk程序;利用unix支持的命令解释器功能,可以将一段awk程序写入到文本文件中,第一行写上:

         #!/bin/awk –f

         赋予文件执行的权限。这样做之后,命令行中可以用类似下面的方式调用并执行这段程序了:

         awk脚本文件名     待处理文件

 

 

AWK语法:

         如同其他的UNIX命令,AWK语法如下:

         awk [-F re][parameter…][‘prog’][-f progfile]

         参数说明:

         -F re:允许awk更改其字段分隔符;

         parameter:该参数帮助为不同的变量赋值;

         ‘prog’:awk的程序语句段,必须用’’隔开,以防止为shell解释。这个程序语句段的标准形式为:’pattern’

         其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成.sed类似,可以使用”,”分开两样式以选择某个范围。(参考:grepsed技术)。action参数总是被大括号包围,它由一系列awk语句组成,各语句之间用”;”分隔。awk解释它们,并在pattern给定的样式的记录上执行其操作。与shell类似,你也可以用”#”作为注释符,解释执行时,它们将会被忽略。你可以省略patternaction之一,但不能两者同时省略,当省略Pattern时没有样式匹配,表示对所有记录均执行操作,省略action执行缺省的操作-在标准输出上显示;

        

         -f progfile:允许awk调用并执行progfile指定的程序文件。progfile是一个文本文件,必须符合awk的语法

         in_file:awk的输入文件,awk允许对多个输入文件进行处理。awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。

 

Awk的记录,字段和内置函数

         grepsed不同的是,awk能够支持对记录和字段的处理;

         默认情况下:awk将文本的一行视为一个记录;某一部分作为一个字段;

        为了操作这些字段,awk借用了shell的方法,1,2,3…这样的方式来顺序地表示行(记录)中的不同字段。特殊的,awk0表示整个行(记录)

         不同的字段之间用分隔符的字符分隔开,系统默认的分隔符是空格。awk允许用-F re的形式来改变这个分隔符。事实上,awk内置变量FS来记忆这个分隔符(RS 记录分隔符变量,当前工作的记录数NR  你可以利用NR在模式中指定工作范围,可以使用RS指定特殊的分隔符作为记录的分隔符)

         eg: awk –F % ‘NR==5 NR==15 {printf $1 $3 $7}’ 将文件中以%作为字段分隔符的记录的第5行到第15行中的记录作为处理范围,在标准输出流中分别打出第1,3,7个字段

         或者说,将文件中的第五行到十五行中以%分隔的1,3,7字段显示出来

 

Awk的内置函数

         awk使用了一系列类C的内置字符串处理函数

         例如:printf: awkprintf完全可以照C语言的模式使用awk中的printf

          显示myfile中的行号和第3字段

          awk  ‘{printf”%03d%s/n”,NR,1} ’

 

Awk的命令行使用

        egs:

         eg1:显示文本文件mydoc匹配(含有)字符串’google’的所有行

                  awk  ‘/google/’  mydoc

     由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。

    eg2:显示一个Sun(sun)出现行和第一个Moon(moon)出现行之间的行

        awk  ‘/[Ss]un/,/[Mm]oon/’ myfile

         eg3: 显示内置变量和内置函数:显示myfile中所有行字符超过80个字符的行号

                   awk ‘length($0)>80 {print NR}’ myfile

         eg4: UNIX用户进行安全性检查,方法:考察/etc/password文件,检查其中passwd字段(第二字段)是否为’*’,如不为’*’,表示该用户没有设置密码,显示出这些用户名(第一字段)

         awk –F: ‘$2==”” {printf(“%s no password!”,$1)}’ /etc/password

awk内置变量详细介绍:

         argc 命令行参数个数(不包括awk的选项和awk的程序内容)

         argv 命令行参数序列数组,下标从0开始

         argind 当前正在处理的argv中文件的索引值(同时处理多个文件会用到)

         convfmt 数字转化格式,C语言中的数字输出格式化类似,默认为”%.6g”

         environ  当前环境的环境变量

         errno    出错时错误信息

         fieldwidths 以空格分隔的字符宽度,如果指定此变量,awk将会用指定的宽度替换变量FS置顶的分隔符,egs:

         fieldname 当前正在处理的文件名,该变量不能在begin中使用

         fnr    当前正在处理的记录号

         fs        字段的分隔符,默认为空格

         ignorecase 如果该变量设置为0,在进行字符串匹配时忽略大小写;

         NF 当前记录中的字段个数

  NR 已经读出的记录数

  OFMT 数字的输出格式

  OFS 输出的字段分隔符,默认为空格

  ORS 输出的记录分隔符,默认为新行

  RS 输入记录的分隔符,默认为新行

  RSTART match()函数匹配的字符串的起始位置,如果没有匹配则为0(从1开始)

  RLENGTH match()函数匹配的字符串的长度

  SUBSEP 数组中多个下标的分隔符,默认为"/034"

 

Awk的变量:

         awk的设置变量要求,1)使用时必须在前面增加””, 2)不能和内置变量重名3)不需要初始化和指定类型;

         运算:             

                  +,-,*,/,%,,++,--,+=,-=,运算函数(log,sqr,cos,sin),字符串运算(length,substr

         关系判断:

            ==,!=,>,=,>=; 样式匹配:~匹配于   !~ 不匹配于

         逻辑运算符:

            !,&&,||,()

AWK的流程控制

1.       begin end

awk中两个特别的表达式,beginend,这两者都可以用于pattern

eg:累计销售文件中的xs中的销售金额(假设销售金额在记录的第三字段)

awk

         >‘BEGIN(FS=”:”;print “统计销售金额”;total=0)

         >       {print $3; total=total+$3;}

         >END(printf “销售金额总计:%2f”,total)’ sx

(注:>shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠/

2.流程控制语句:

         if  else; 支持{}

while ; do while ; for

                   break,continue控制流程走向

 

AWK自定义函数

         原始的awk并不提供函数功能,只有在nawk或者awk版本中才可以增加函数;

         函数定义:

         function 函数名(参数表){

}

gawk中允许将function省略为func;

函数调用时不执行参数有效性检查;

awk函数有两种返回方式:隐式返回和显式返回

eg:

nawk:

>’BEGIN{pageno=1;file=FILENAME}

>pageno=print_header(file,pageno);

>printf(“当前页号:%d/n”,pageno);

>}

>#定义函数print_header

>function print_header(FileName,PageNum){

>       printf(“%s %d/n”,FileName,PageNum);

>      PageNum++;

>   return PageNum;

>}’ myfile

 

        

Awk的高级输入输出

1.       读取下一条记录:

next

2   getline(成功1,失败0)

         {

                   while(getline==1){

                                     #process the inputted fields

}

}

         printf(“hello word!/n”)>>”datafile”

3  输入到一个命令

         printf(“hello world!/n”)|”sort -t”

         awkscript混合编程

 

备注:是对 http://baike.baidu.com/view/209681.htm?fr=ala0_1_1 个人性的总结性笔记  

别晓峰

原创粉丝点击