AWK 用法简介
概要
AWK是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan. 与sed和grep很相似,awk是一种样式扫描与处理工具,但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。awk的三位创建者已将它正式定义为:样式扫描和处理语言。
AWK的调用方式
1). 程序体直接写到AWK命令行中,适用较简单的情况
awk 'program' input-file1 input-file2 ...
2). 程序体写入文件中,用AWK命令调用该文件
awk -f program-file input-file1 input-file2 ...
3). C shell作为命令解释程序,调用AWK来执行AWK程序,写成的脚本
#!/bin/csh -f
awk '
{ print $8, "\t", $3} \
'
4). AWK作为命令解释程序,写成的脚本
#!/bin/awk -f
{ print $8, "\t", $3}
AWK的参数说明
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
参数说明:
-F re: 允许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会被执行多次
-f progfile: 允许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允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符,可以在程序中进行修改。
AWK的运算,判断与赋值
运算
运算符 用途
------------------
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
--y y减1后使用y(前置减)
y-- 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x
判断:
操作符 含义
x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于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);span lang="EN-US" style="">#调用函数print_header
>printf("当前页页号是:%d\n",pageno);
}
#定义函数print_header
function print_header(FileName,PageNum){
printf("%s %d\n",FileName,PageNum); >PageNum++;return PageNUm;
}
}' myfile
AWK的内置变量(预定义变量)
说明:表中v项表示第一个支持变量的工具:A=awk,N=nawk,P=POSIX awk,G=gawk
V 变量 含义 缺省值
--------------------------------------------------------
N ARGC 命令行参数个数
G ARGIND 当前被处理文件的ARGV标志符
N ARGV 命令行参数数组
G CONVFMT 数字转换格式 %.6g
P ENVIRON UNIX环境变量
N ERRNO UNIX系统错误消息
G FIELDWIDTHS 输入字段宽度的空白分隔字符串
A FILENAME 当前输入文件的名字
P FNR 当前记录数
A FS 输入字段分隔符 空格
G IGNORECASE 控制大小写敏感0(大小写敏感)
A NF 当前记录中的字段个数
A NR 已经读出的记录数
A OFMT 数字的输出格式 %.6g
A OFS 输出字段分隔符 空格
A ORS 输出的记录分隔符 新行
A RS 输入的记录他隔符 新行
N RSTART 被匹配函数匹配的字符串首
N RLENGTH 被匹配函数匹配的字符串长度
N SUBSEP 下标分隔符 "\034"
AWK的内置函数
V 函数 用途或返回值
------------------------------------------------
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符个数
N match(string,reg) 返回常规表达式reg匹配的string中的位置
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
N sprintf(format,variable) 返回包含基于format的格式化数据,variables是要放到串中的数据
G strftime(format,timestamp) 返回format日期或时间串,timestmp是systime()函数返回的时间
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
A substr(string,position,len) 返回一个以position开始len个字符的子串
P totower(string) 返回string中对应的小写字符
P toupper(string) 返回string中对应的大写字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x幂
A int(x) x的整数部分
A log(x) x的自然对数值
N rand() 0-1之间的随机数
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
G system() 返回自1970年1月1日以来经过的时间(按秒计算)
一些例子:
1. 打印11月被修改的文件的字节数
ls –lg | awk '$6 == “NOV” {sum += $5} END {print sum}'
2. 文件result中包含FAILED的行数
awk '/FAILED/ {sum += 1} END {print sum}' result
3. 打印file文件最长行的长度
awk 'if (length($0) > max) max = length($0)} END {print max}' file
4. 输出file文件的行数
awk 'END {print NR}' file
NR是内置变量,表示已经读出的记录数,在END后输出即是总行数
用cat file | wc –l 命令组合可以完成同样的功能
概要
AWK是Unix平台上一种可以对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan. 与sed和grep很相似,awk是一种样式扫描与处理工具,但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。awk的三位创建者已将它正式定义为:样式扫描和处理语言。
AWK的调用方式
1). 程序体直接写到AWK命令行中,适用较简单的情况
awk 'program' input-file1 input-file2 ...
2). 程序体写入文件中,用AWK命令调用该文件
awk -f program-file input-file1 input-file2 ...
3). C shell作为命令解释程序,调用AWK来执行AWK程序,写成的脚本
#!/bin/csh -f
awk '
{ print $8, "\t", $3} \
'
4). AWK作为命令解释程序,写成的脚本
#!/bin/awk -f
{ print $8, "\t", $3}
AWK的参数说明
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
参数说明:
-F re: 允许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会被执行多次
-f progfile: 允许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允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符,可以在程序中进行修改。
AWK的运算,判断与赋值
运算
运算符 用途
------------------
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
--y y减1后使用y(前置减)
y-- 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x
判断:
操作符 含义
x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于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);span lang="EN-US" style="">#调用函数print_header
>printf("当前页页号是:%d\n",pageno);
}
#定义函数print_header
function print_header(FileName,PageNum){
printf("%s %d\n",FileName,PageNum); >PageNum++;return PageNUm;
}
}' myfile
AWK的内置变量(预定义变量)
说明:表中v项表示第一个支持变量的工具:A=awk,N=nawk,P=POSIX awk,G=gawk
V 变量 含义 缺省值
--------------------------------------------------------
N ARGC 命令行参数个数
G ARGIND 当前被处理文件的ARGV标志符
N ARGV 命令行参数数组
G CONVFMT 数字转换格式 %.6g
P ENVIRON UNIX环境变量
N ERRNO UNIX系统错误消息
G FIELDWIDTHS 输入字段宽度的空白分隔字符串
A FILENAME 当前输入文件的名字
P FNR 当前记录数
A FS 输入字段分隔符 空格
G IGNORECASE 控制大小写敏感0(大小写敏感)
A NF 当前记录中的字段个数
A NR 已经读出的记录数
A OFMT 数字的输出格式 %.6g
A OFS 输出字段分隔符 空格
A ORS 输出的记录分隔符 新行
A RS 输入的记录他隔符 新行
N RSTART 被匹配函数匹配的字符串首
N RLENGTH 被匹配函数匹配的字符串长度
N SUBSEP 下标分隔符 "\034"
AWK的内置函数
V 函数 用途或返回值
------------------------------------------------
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符个数
N match(string,reg) 返回常规表达式reg匹配的string中的位置
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
N sprintf(format,variable) 返回包含基于format的格式化数据,variables是要放到串中的数据
G strftime(format,timestamp) 返回format日期或时间串,timestmp是systime()函数返回的时间
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
A substr(string,position,len) 返回一个以position开始len个字符的子串
P totower(string) 返回string中对应的小写字符
P toupper(string) 返回string中对应的大写字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x幂
A int(x) x的整数部分
A log(x) x的自然对数值
N rand() 0-1之间的随机数
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
G system() 返回自1970年1月1日以来经过的时间(按秒计算)
一些例子:
1. 打印11月被修改的文件的字节数
ls –lg | awk '$6 == “NOV” {sum += $5} END {print sum}'
2. 文件result中包含FAILED的行数
awk '/FAILED/ {sum += 1} END {print sum}' result
3. 打印file文件最长行的长度
awk 'if (length($0) > max) max = length($0)} END {print max}' file
4. 输出file文件的行数
awk 'END {print NR}' file
NR是内置变量,表示已经读出的记录数,在END后输出即是总行数
用cat file | wc –l 命令组合可以完成同样的功能