【转载】linux AWK用法简介

AWK用法简介

概要

AWK是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan.与sed和grep很相似,awk是一种样式扫描与处理工具,但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。awk的三位创建者已将它正式定义为:样式扫描和处理语言。

AWK的调用方式

1).程序体直接写到AWK命令行中,适用较简单的情况

awk'program'input-file1input-file2...

2).程序体写入文件中,用AWK命令调用该文件

awk-fprogram-fileinput-file1input-file2...

3).Cshell作为命令解释程序,调用AWK来执行AWK程序,写成的脚本

#!/bin/csh-f

awk'

{print$8,"\t",$3}\

'

4).AWK作为命令解释程序,写成的脚本

#!/bin/awk-f

{print$8,"\t",$3}

AWK的参数说明

awk[-Fre][parameter...]['prog'][-fprogfile][in_file...]

参数说明:

-Fre:允许awk更改其字段分隔符。

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

'prog':awk的程序语句段。必须用单引号:'和'括起,以防被shell解释。

这个程序语句段的标准形式为:'pattern{action}'

(1)pattern参数是匹配模式,跟Sed命令类似。

(2)action参数总是被大括号包围,由一系统awk语句组成,各语句间用";"分隔。

awk在pattern给定的样式匹配记录上执行其操作。使用“#”作为注释符。

(3)可以省略pattern和action之一,但不能两者同时省略,当省略pattern时没

有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作—在标准输出上显示。

(4)可以包含多个pattern{action},如果一个记录满足多个pattern,其对应的action会被执行多次

-fprogfile:允许awk调用执行程序文件。progfile是一文本文件,必须符合awk语法。

in_file:awk的输入文件,awk允许对多个输入文件进行处理。

*awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。(跟SED类似)

AWK的记录(Record)与字段(Field)

awk处理的工作与数据库的处理方式有相同之处,其相同处之一就是awk支持对记录和字段的处理,其中对字段的处理是grep和sed不能实现的。在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awk借用shell的方法,用$1,$2,$3...这样的方式来顺序地表示行(记录)中的不同字段。特殊地,awk用$0表示整个行(记录)。不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-Fre的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符,可以在程序中进行修改。

AWK的运算,判断与赋值

运算

运算符用途

------------------

x^yx的y次幂

x**y同上

x%y计算x/y的余数(求模)

x+yx加y

x-yx减y

x*yx乘y

x/yx除y

-y负y(y的开关符号);也称一目减

++yy加1后使用y(前置加)

y++使用y值后加1(后缀加)

--yy减1后使用y(前置减)

y--使用后y减1(后缀减)

x=y将y的值赋给x

x+=y将x+y的值赋给x

x-=y将x-y的值赋给x

x*=yx*y的值赋给x

x/=y将x/y的值赋给xx%=y将x%y的值赋给x

x^=y将x^y的值赋给x

x**=y将x**y的值赋给x

判断:

操作符含义

x==yx等于y

x!=yx不等于y

x>yx大于y

x>=yx大于或等于y

x小于y

x>='BEGIN{FS=":";print"统计销售金额";total=0}

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

>END{printf"销售金额总计:%.2f",total}'sx

>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,在行尾加反斜杠\

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

2、流程控制语句

2.1、if...else语句:

if(表达式)

语句1

else

语句2

格式中"语句1"可以是多个语句,如果你为了方便awk判断也方便你自已阅读,你最好将多个语句用{}括起来。awk分枝结构允许嵌套。

2.2、while语句

while(表达式语句

2.3、do-while语句

do

{

语句

}while(条件判断语句)

2.4、for语句

for(初始表达式;终止条件;步长表达式)

{语句}

while、do-while和for语句中允许使用break,continue,exit来控制程序走向。

Break:中断当前正在执行的循环并跳到循环外执行下一条语句。

Continue:从当前位置跳到循环开始处执行。

Exit:当exit语句不在END中时,该命令表现得如同到了文件尾,所有模式或操作将停止,END模式中的操作被执行。而出现在END中的exit将导致程序终止。

AWK的变量

awk提供两种变量,一种是awk内置的变量,在awk程序中引用内置变量不需要使用标志符"$"awk提供的另一种变量是自定义变量。当然这种变量不能与内置变量及其它awk保留字相同,在awk中引用自定义变量必须在它前面加上标志符"$"。与C语言不同的是,awk中不需要对变量进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。

AWK中的函数

AWK的函数同样包括内置函数和用户自定义的函数。原始的awk不提供函数功能,只有在nawk或较新的awk版本中才可以增加函数。

函数的使用包含两部分:函数的定义与函数调用。其中函数定义又包括要执行的代码(函数本身)和从主程序代码传递到该函数的临时调用。

awk函数的定义方法如下:

function函数名(参数表){

函数体

}

函数名必须是一个合法的标志符,参数表中可以不提供参数(但在调用函数时函数名后的一对括号仍然是不可缺少的),也可以提供一个或多个参数。awk的参数也是通过值来传递的。

在awk中调用函数比较简单,其方法与C语言相似,但awk比C语言更为灵活,它不执行参数有效性检查。换句话说,在你调用函数时,可以列出比函数预计(函数定义中规定)的多或少的参数,多余的参数会被awk所忽略,而不足的参数,awk将它们置为缺省值0或空字符串,具体置为何值,将取决于参数的使用方式。

awk函数有两种返回方式:隐式返回和显式返回。当awk执行到函数的结尾时,它自动地返回到调用程序,这是函数是隐式返回的。如果需要在结束之前退出函数,可以明确地使用返回语句提前退出。方法是在函数中使用形如:return返回值格式的语句。

例:下面的例子演示了函数的使用。

nawk

>'BEGIN{pageno=1;file=FILENAME

>pageno=print_header(file,pageno);spanlang="EN-US"style="">#调用函数print_header

>printf("当前页页号是:%d\n",pageno);

}

#定义函数print_header

functionprint_header(FileName,PageNum){

printf("%s%d\n",FileName,PageNum);>PageNum++;returnPageNUm;

}

}'myfile

AWK的内置变量(预定义变量)

说明:表中v项表示第一个支持变量的工具:A=awk,N=nawk,P=POSIXawk,G=gawk

V变量含义缺省值

--------------------------------------------------------

NARGC命令行参数个数

GARGIND当前被处理文件的ARGV标志符

NARGV命令行参数数组

GCONVFMT数字转换格式%.6g

PENVIRONUNIX环境变量

NERRNOUNIX系统错误消息

GFIELDWIDTHS输入字段宽度的空白分隔字符串

AFILENAME当前输入文件的名字

PFNR当前记录数

AFS输入字段分隔符空格

GIGNORECASE控制大小写敏感0(大小写敏感)

ANF当前记录中的字段个数

ANR已经读出的记录数

AOFMT数字的输出格式%.6g

AOFS输出字段分隔符空格

AORS输出的记录分隔符新行

ARS输入的记录他隔符新行

NRSTART被匹配函数匹配的字符串首

NRLENGTH被匹配函数匹配的字符串长度

NSUBSEP下标分隔符"\034"

AWK的内置函数

V函数用途或返回值

------------------------------------------------

Ngsub(reg,string,target)每次常规表达式reg匹配时替换target中的string

Nindex(search,string)返回string中search串的位置

Alength(string)求串string中的字符个数

Nmatch(string,reg)返回常规表达式reg匹配的string中的位置

Nprintf(format,variable)格式化输出,按format提供的格式输出变量variable。

Nsplit(string,store,delim)根据分界符delim,分解string为store的数组元素

Nsprintf(format,variable)返回包含基于format的格式化数据,variables是要放到串中的数据

Gstrftime(format,timestamp)返回format日期或时间串,timestmp是systime()函数返回的时间

Nsub(reg,string,target)第一次当常规表达式reg匹配,替换target串中的字符串

Asubstr(string,position,len)返回一个以position开始len个字符的子串

Ptotower(string)返回string中对应的小写字符

Ptoupper(string)返回string中对应的大写字符

Aatan(x,y)x的余切(弧度)

Ncos(x)x的余弦(弧度)

Aexp(x)e的x幂

Aint(x)x的整数部分

Alog(x)x的自然对数值

Nrand()0-1之间的随机数

Nsin(x)x的正弦(弧度)

Asqrt(x)x的平方根

Asrand(x)初始化随机数发生器。如果忽略x,则使用system()

Gsystem()返回自1970年1月1日以来经过的时间(按秒计算)

一些例子:

1.打印11月被修改的文件的字节数

ls–lg|awk'$6==“NOV”{sum+=$5}END{printsum}'

2.文件result中包含FAILED的行数

awk'/FAILED/{sum+=1}END{printsum}'result

3.打印file文件最长行的长度

awk'if(length($0)>max)max=length($0)}END{printmax}'file

4.输出file文件的行数

awk'END{printNR}'file

NR是内置变量,表示已经读出的记录数,在END后输出即是总行数

用catfile|wc–l命令组合可以完成同样的功能

相关推荐